4月 092018
 

疑问一:如果创建Handler没有为Handler指定Looper,那么Handler用的是哪个Looper?

答:如果没有指定Looper的话,程序会通过Looper.myLooper();来获取当前线程中保存的Looper对象.

扩展:如果一个线程中没有Looper实例,则在创建Handler时即会触发异常

疑问二:如果在程序中建立了多个Handler,都使用同一个Looper(如使用主线程的Looper),那么消息会在每个Handler中都被处理吗?

答:不会,可以看下Handler代码中,enqueueMessage函数里面,将msg.target设置为了Handler本身.而在Looper的loop函数中,是通过msg.target.dispatchMessage(msg);将消息分发出去的,所以不会造成Handler接收消息的错乱.

疑问三:一个线程能不能有多个Looper?

答:不能,Looper的构造函数是私有的,Looper只能通过它的静态方法prepare()函数来创建,这个函数会检查当前线程中是否已有Looper实例,如果已有会报异常,如果没有则创建一个新的.

疑问四:Handler内存泄漏的原理?

Handler内存泄漏是因为,如果创建非静态的内部Handler类,会隐式的持有外部类的实例,所以当Activity销毁时,Handler有未执行的消息时,就会造成内在的泄漏.

并不是有静态内部Handler类就会引起内存泄漏,假如在Activity销毁后,Handler没有继续要执行的工作,也不会造成内存泄漏。

打赏
 Posted by on 2018-04-09