Android 消息传递Handler的正确用法

来源:互联网 发布:网络大电影受众分析 编辑:程序博客网 时间:2024/05/21 10:55

                                                        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);}@Overridepublic void handleMessage(Message msg) {//更新UI操作MainActivity theActivity = mActivity.get();  theActivity.timeUIUpdate();}}

       由于静态内部类不能直接调用外部类对象(this)相关成员,加上WeakRefrence的机制,基本上可以避免出现泄漏的情况。
0 0
原创粉丝点击