Handler复习笔记1

47 阅读1分钟

了解Handler的原理,主要是了解从sendMessage我们发消息,到handlerMessage处理消息的过程。 Handler有14种发消息的方法,各种sendMessage,但最终的过程都是到enqueueMessage方法。 enqueueMessage方法中,是维持了一个优先级队列。 优先级队列是根据时间,进行排序。就是一个根据时间先后顺序排序的单链表。 Looper.loop()方法是是一个死循环,不停的读取消息。loop方法会调用messageQueue.next函数。next()函数,接着会调用DispatchMessage方法。接着msg.target.dispatchMessage会调用handlerMessage

面试题:

一个线程中可以有多少个Handler?

答:N个。

一个线程有几个Looper?如何保证?

答:一个。

使用ThreadLocal变量来保证和looper的一一对应。当我们调用线程的prepareLooper的时候。就会去把线程和looper作为key value保存进去。如果已经之前有set了,就会报错。

Handler内存泄漏的原因是什么?为什么其他内部类没有说过这个问题?

答:内部类持有外部类的对象。我们的MessageQueue会持有持有Message,Message会持有Handler,Handler会持有外部类This.所以。比如我们的消息delay1秒执行。只有消息处理了,才会销毁handler。这是真正的原因 虽然所有的内部类都会持有外部类对象,但是没有另外一个东西持有这个内部类。