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