在Android应用中使用处理程序时出现泄漏如何解决

  介绍

这篇文章给大家介绍在Android应用中使用处理程序时出现泄漏如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

,,在Android中,处理程序类应该是静态的,否则,可能发生泄漏。在应用程序线程的MessageQueue中排队的消息对象还保留他们的目标处理程序。如果处理程序是一个内部类(注:无论是匿名还是非匿名,匿名是比较常见用法),它的外部类将被保留(至于为什么,请参考Java嵌套类相关说明)。为了避免泄漏外部类,声明一个处理程序子类为静态内部类(注:这样就避免了处理程序对象对外部类实例的自动引用),其内部持有一个对外部类对象的WeakReference。

,,,上面是HandlerLeak的详细解释,同时下划线部分也提供了解决方案的思路。我们需要再分析一下几个泄漏问题:(1)排队中的消息对象对处理程序的持有导致泄漏;(2)处理程序对象对外部类(如活动或服务)实例的强引用持有。是由于这两个原因同时作用导致出现泄漏的可能。我们的解决方案可以从原因出发,清除这两个原因,就会比较完整的解决这个问题。

,, <强>,方案:(1)针对第1个原因,在使用处理程序的组件生命周期结束前清除掉MessageQueue中的发送给处理程序的消息对象(例如在活动或服务的onDestroy()中调用处理程序的删除*方法);(2)针对第2个原因,处理程序的实现类采用静态内部类的方式,避免对外部类的强引用,在其内部声明一个WeakReference引用到外部类的实例。

,,,关于处理程序的删除*方法,这儿介绍一下(可以参考源码或文档)

removeCallbacks (Runnable r)——清除r匹配上的信息。

removeCallbacks (Runnable r,令牌对象)——清除r匹配且匹配牌(消息。obj)的消息,令牌为空时,只匹配r。

removeCallbacksAndMessages令牌(对象)——清除牌匹配上的信息。

removeMessages (int)——按什么来匹配

removeMessages (int,对象对象)——按什么来匹配

我们更多需要的是清除以该处理程序为目标的所有消息(包括回调),那么调用如下方法即可

,,,handler.removeCallbacksAndMessages (null);

<强>,,,最终代码像下面这样

package  org.dragonboy.example;   ,   import  java.lang.ref.WeakReference;   ,   import  android.app.Activity;   import  android.os.Bundle;   import  handler;   import  android.os.Message;   ,/* *   ,* @author  dragonboyorg@qq.com   ,*/public  class  MyActivity  extends  Activity  {   private 才能;MyHandler  mHandler;   ,   @Override才能   protected 才能;void  onCreate (Bundle  savedInstanceState), {   ,,,super.onCreate (savedInstanceState);   ,   ,,,mHandler =, new  MyHandler(这个);   ,,}   ,   @Override才能   protected 才能;void  onDestroy (), {   ,,,//,Remove  all  Runnable 以及信息。   ,,,mHandler.removeCallbacksAndMessages(空);   ,   ,,,super.onDestroy ();   ,,}   ,   static 才能class  MyHandler  extends  Handler  {   ,,,//,WeakReference 用,outer 类# 39;s 实例。   ,,,private  WeakReference,巴;   ,   ,,,public  MyHandler (MyActivity 活动),{   ,,,,,mOuter =, new  WeakReference(活动);   ,,,}   ,   ,,@Override   ,,,public  void  handleMessage (Message 味精),{   ,,,,,MyActivity  outer =, mOuter.get ();   ,,,,,if  (outer  !=, null), {   ,,,,,,,//,Do  something  with  outer  as  your 愿望。   ,,,,,}   ,,,}   ,,}   }   & lt;/myactivity> & lt;/myactivity>

关于在Android应用中使用处理程序时出现泄漏如何解决就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

在Android应用中使用处理程序时出现泄漏如何解决