Android Handler基本原理

1 new Handler 默认使用的是Looper.mainLooper()
然而可以设置为其它Looper, 比如 HandlerThread
HandlerThread handlerThread = new HandlerThread( "jun" );
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper()) {}
2 设置其它线程的Looper ,需要调用prerate 方法
3 Looper 中有消息队列 和for() 死循环
MessageQuene
4 handler 发送消息,存到消息队列
5 Looper的死循环,拿消息队列的数据,分发到回调这里
6 handler post(Runnable ) (并不是新开线程)
事实上,是发送了一个Message, message.callback = runnable 作为一个属性。
最终在处理消息时,执行run 方法
所以,handler 的for 循环属于哪个线程,runnable 就运行在哪个线程
handler{
初始化 Looper{
MessageQuene
for() 死循环
}
}
7 为什么会内存泄漏
A handler 默认对应主线程,存在delay 消息未处理。handler 不会回收,(匿名内部类,持有外部类的引用)导致此Activity 也无法被回收,从而导致内存泄漏。
B handler 对应的子线程未关闭,存在Delay 消息处理,此handler 不会被回收。
解决方案:
A 采用静态+弱引用
静态:就不会持有外部类的引用
弱引用: 对Activiyt 弱引用,就可以操作里面的对象,并且可操作里面的对象
GC回收时,如果时弱引用,一样会回收对象
B Looper.quitSaftly() 或者移除所有消息

关键:
1 一个线程包含一个Looper
Looper 设置到handler 的属性中(默认情况下,就是主线程的Looper)
2 Looper 中的调用looper_() 方法,开启死循环,处理messagequene 中的消息队列
3 sendmessage post 本质上都是发送消息

猜你喜欢

转载自blog.csdn.net/qq_42022061/article/details/80762828