先看整体模型
在new Handler的时候会在构造函数里面同时实例化一个Looper
所以实例化Handler的前提条件就是要先实例化一个Looper,调用Looper.prepare()来实现的,没有调用prepare,是无法实例化Handler的,这里要注意ThreadLocal是在prepare函数那边set了Looper对象,所以get的时候才会有值,关于ThreadLocal可以专门看别的文章,是线程私有变量的容器,有点小复杂
这个Looper实例化的时候会同时实例化一个MessageQueue,和获取当前线程
综上所述,如果要在一个子线程实例化Handler的时候必须先调用Looper.prepare(),而主线程在创建activity的时候就已经调用了prepare(),所以我们可以在主线程直接实例化Handler;
Android提供了一个封装好的带有looper的线程类,即为HandlerThread,其实现在用了rxjava后,Handler这块就不用担心内存泄漏,如果想自己开启一个队里来管理,可以考虑HandlerThread,但是内存开销要注意;
网友评论