Handler机制
JasonDev324

Handler的理解

Handler引入背景
在子线程里操作UI导致崩溃、在子线程弹Toast无反应。
多线程并发操作UI可能会导致安全问题,Android提供一种解决方法,只能在UI线程里操作UI。Handler机制能实现周期性修改UI。
类似还有事件总线。

Handler的作用

Handler机制主要用于解决多线程并发操作UI可能导致的安全问题。
用于在非UI线程更新UI。
线程间通信

Handler内部原理

UI线程,UI线程初始化,提供消息传送的环境.(创建一个Looper对象和MessageQueue队列)

Handler:主要用于发送消息和处理消息,在主线程中使用,隐式持有activity引用,所以可以操作UI。

MessageQueue:消息队列,先进先出的方式管理Message。伴随Looper的初始化而创建。

Message:消息的载体,Handler处理的对象。

Looper:创建管理MessageQueue,循环从队列中取出Message分发给Handler。

image

Handler执行流程

子线程修改UI->Handler发送消息(sendEmptyMessage等方法)->Message存入到MessageQueue队列->Looper取出Message分发给Handler->Handler处理消息(handleMessage方法)

在子线程使用Handler

主线程发送消息,子线程接收消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class HandlerThread extends Thread {
Handler handler;

@Override
public void run() {
super.run();
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 子线程接收消息
}
};
Looper.loop();
}
}

在子线程使用handler之HandlerThread

1
2
3
4
5
6
7
8
9
10
HandlerThread handlerThread = new HandlerThread("666");
handlerThread.start();

Handler handler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
handler.sendEmptyMessage(0);

HandlerThread的使用

image

菜鸟参考

Handler总结

Powered by Hexo & Theme Keep
Total words 22k Unique Visitor Page View