android学习笔记(七):Handler消息传递机制

1、先举个例子:
图片定时轮播
MainActivity.java:

package com.example.weixin;

import java.util.Timer;
import java.util.TimerTask;

import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;

public class MainActivity extends ActionBarActivity {

    int[] drawable = new int[]{
            R.drawable.a,
            R.drawable.b,
            R.drawable.c
        };
    int i = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView imageView = (ImageView)findViewById(R.id.view);
        final Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                if(msg.what == 0x110)
                {

                    imageView.setImageResource(drawable[i++%drawable.length]);
                }
            }
        };
        new Timer().schedule(new TimerTask() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                handler.sendEmptyMessage(0x110);
            }
        },0,1200);

    }

  • 方法内的匿名内部类调用局部变量时,该局部变量必须是常量。此时内部类会把该常量复制一份放到内部类中,这样,方法结束时,虽然局部变量消失了,但是内部类中的常量还是可以使用的
    原因参考:http://www.cnblogs.com/dolphin0520/p/3811445.html

  • 图片资源的名字不能是数字,否则出错

  • 只有UI线程能处理与UI相关的事件,其他线程不能处理,这样就用到了handler消息处理机制
    android学习笔记(七):Handler消息传递机制_第1张图片

2、Looper、Handler、MessageQueue的作用:
- Looper:每个线程只有一个Looper,它负责管理MessageQueue,会不断地从MessageQueue中取出消息,并将消息分给对应的Handler处理
- MessageQueue:有Looper负责管理,它采用先进先出的方式来管理Message
- Handler:它能把消息发送给MessageQueue,并负责处理Looper分给它的消息
3、 在线程中使用Handler的步骤如下:
- 调用Looper的prepare()方法为当前线程创建Looper对象,创建对象时,它的构造器会创建与之配套的MessageQueue
- 有了Looper后,创建Handler的实例,重写handleMessage()方法,该方法负责处理来自于其他线程的消息
- 调用Looper的loop()方法,启动Looper

你可能感兴趣的:(Android学习笔记)