Android消息机制Hanlder

Hanlder线程之间发送消息就是以下三种:

 * 1.子线程向主线程发送消息
 * 2.主线程向子线程发送消息
 * 3.子线程向子线程发送消息
//子线程向主线程发送消息 实现一
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};
new Thread(new Runnable() {
    @Override
    public void run() {

        //hanler直接post一个Runnable Runnable运行与创建handler的线程  同hanldermessage()
        handler.post(new Runnable() {
            @Override
            public void run() {
                textView.setText("测试");
            }
        });
        handler.dispatchMessage(handler.obtainMessage());
    }
}).start();

}

子线程中使用Hanlder

private class MyThread extends Thread{

Handler handler1 = null;

@Override

public void run() {

//子线程创建使用handler 要使用Looper.propare()创建子线程的looper,然后Looper.loop()开始工作

//Looper中使用ThreadLocal来保存线程生成的looper

Looper.prepare();

handler1 = new Handler(){

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//handler在哪个线程创建,handleMessage就运行在哪个线程

}

};

Looper.loop();

}

}

Looper.loop()方法运行在哪个线程 最终处理消息就是在对应的线程,Hanlder中的消息队列MessageQueue直接使用Looper中的MessageQueue,使用hanlder发送消息后消息进入对应的MessageQuene,然后对应的Looper从MessageQueue中拿到消息后执行。

主线程不用显示的调用Looper.prepare();Looper.loop();因为系统已经默认在运行主线程中调用过,主线程的Looper处于运行中。

 

Looper.loop()方法会不停的去MessageQueue中的Message,拿到消息Message后,调用Message方法的成员变量(Hanlder的实例target)的dispatchMessage(msg)方法

 

处理消息的三种方式(包括优先级):

1.Message消息自己的Runnable

2.Handler目标target的Callback

2.Handler中的空方法handleMessage(msg)

 

hanlder.post(Runnable runnable)的实际操作是生成一个Message消息体,将runnable赋值给Message,即为处理消息的方式一;

 

关于HanlderThread:

HandlerThread handlerThread = new HandlerThread("hanlder-thread");

handlerThread.start();//启动handler线程

 

//创建子线程(HanderThread)的Handler

final Handler handler2 = new Handler(handlerThread.getLooper()){

@Override

public void handleMessage(Message msg) {

//此时handlerMessage方法运行在指定的HandlerThread线程中

super.handleMessage(msg);

}

};

 

创建子线程Hanlder的时候,如果直接传入Looper会报空指针异常,因为Looper还没有准备,而系统给我们提供了一个可以使用的HanlderThread,其内部在获取Looper的方法getLooper()获取时,若looper没有准备使用了wait()来让HanlderThread线程等待,在执行的run()方法中准备好Looper用notifyAll()唤醒线程,即此时looper已经准备好。

 

//2.主线程向子线程发送消息   主线程中调用子线程的hanlder(因为是子线程的hanlder执行在子线程中)发送消息
handler2.sendMessage(handler2.obtainMessage());


//3.子线程向子线程发送消息 实现三
new Thread(new Runnable() {
    @Override
    public void run() {
        //当前子线程向HandlerThread子线程发送消息
        handler2.sendMessage(handler2.obtainMessage());
    }
}).start();

 

Looper 线程唯一,prepare()准备的时候会初始化Looper实例,存入ThreaLocal变量中,消息队列MessageQueue也同时初始化创建。looper()方法去消息后 dispatchMessage()方法下发执行。

Hanlder Hanlder实例创建的时候直接使用Looper中创建的MessageQueue,发送并处理消息 post(Runnable)先创建一个消息然后将Runnable传给消息的成员变量callback。enqueueMessage(msg)将消息加入队列

MessageQueue 消息队列 looper.loop()从中不停的取消息执行。enqueueMessage(msg,when)加入消息,next()取出消息。

Message 消息载体 内部包含一个消息池,最大数量是50,自身是一个单向链表。

 

 

 

 

你可能感兴趣的:(Android)