Android消息传递Handler的正确用法

xiaoxiao2021-02-27  423

                                                        Android  消息传递Handler的正确用法

andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。 1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。  2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。 3) Message Queue(消息队列):用来存放线程放入的消息。 

4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。 

 

                                                  

Handler使用不当很可能导致内存泄漏,如:

       

Handler handler=new Handler() { public void handleMessage(android.os.Message msg) { //do something }; };  

 则会报出警告

   顾名思义可能会发生内存泄漏,为什么会导致内存泄漏:

           由于非静态内部类会持有外部类对象的引用,而Handler又由于Message处理的方式有可能常驻内存当中。这样就会导致外部的Activity或者Service在销毁之后无法及时被GC回收,甚至内存泄漏。

   那么我们需要怎么去解决这个内存泄漏?

   public static class XXXHandler extends Handler { //弱引用 WeakReference<MainActivity> mActivity; XXXHandler(MainActivity activity) { mActivity=new WeakReference<MainActivity>(activity); } @Override public void handleMessage(Message msg) { //更新UI操作 MainActivity theActivity = mActivity.get(); theActivity.timeUIUpdate(); } }         由于静态内部类不能直接调用外部类对象(this)相关成员,加上WeakRefrence的机制,基本上可以避免出现泄漏的情况。
转载请注明原文地址: https://www.6miu.com/read-940.html

最新回复(0)