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,自身是一个单向链表。