一.Handler封装了消息的发送(主要包括消息发送给谁)
Looper
1.内部包含一个消息队列即MessageQueue,所有的Handler发送的消息都走向这个消息队列。
2.Lopper.Looper方法,就是一个死循环,不断地从MessageQueue取消息,若有消息就处理消息,没有消息就阻塞。
二.MessageQueue,就是一个消息队列,可以添加消息,并处理消息。
三:Handler也很简单,内部也会跟Looper进行关联,也就是说在Handler的内部可以找到Looper,找到了Looper也就
找到了MessageQueue,在Handler中发送消息,其实就是向MessageQueue队列中发送消息。
总结:handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给handler自己。MessageQueue是一个储存消息的容器。
二:handler与Looper的基本使用示例
package com.example.kirito.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
/**
* Created by kirito on 2016.10.13.
*/
public class FirstThread extends Activity {
private class MyThread extends Thread{
private Handler handler;
@Override
public void run() {
super.run();
//loop preapare方法开启looper
Looper.prepare();
//下面创建的handler自动与与Looper关联
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//打印当前线程名称
System.out.print("current thread is " + Thread.currentThread());
}
};
//loop方法循环消息
Looper.loop();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testhandler);
MyThread thread = new MyThread();
thread.start();
try {
thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//触发handleMessage方法
thread.handler.sendEmptyMessage(1);
}
}
package com.example.kirito.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
/**
* Created by kirito on 2016.10.13.
*/
public class Second extends Activity {
//HandlerThread可以创建子线程,进行异步操作
private HandlerThread ht;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ht = new HandlerThread("handlerthread");
ht.start();
Handler handler = new Handler(ht.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//进行异步操作
System.out.print("current thread ---->" + Thread.currentThread());
}
};
handler.sendEmptyMessage(1);
}
}
四:handler之间的信息交互
两个handler分别在其各自的handleMessage方法里调用对方handler的sendMessage方法