Android Handler leak

* Android Handler leak 分析及解决办法 
 *
 * In Android, Handler classes should be static or leaks might occur, Messages
 * enqueued on the application thread's MessageQueue also retain their target
 * Handler. If the Handler is an inner class, its outer class will be retained
 * as well. To avoid leaking the outer class, declare the Handler as a static
 * nested class with a WeakReference to its outer class.
 * 
 */
/**
 * 在Android中,Handler类应该是静态的,否则,可能发生泄漏。在应用程序线程的MessageQueue中排队的Message对象
 * 还保留他们的目标Handler。如果Handler是一个内部类(注:无论是匿名还是非匿名,匿名是比较常见用法),它的外部类将被保留(至于为什么,
 * 请参考Java嵌套类相关说明)。为了避免泄漏外部类,声明一个Handler子类为静态内部类(注:这样就避免了Handler对象对外部类实例的自动引用),
 * 其内部持有一个对外部类对象的WeakReference。
 */
/**
 * 上面是HandlerLeak的详细解释,同时下划线部分也提供了解决方案的思路。我们需要再分析一下几个泄漏问题:(1)
 * 排队中的Message对象对Handler的持有导致泄漏;(2)Handler对象对外部类(如Activity或Service)实例的强引用持
 * 有。是由于这两个原因同时作用导致出现泄漏的可能。我们的解决方案可以从原因出发,清除这两个原因,就会比较完整的解决这个问题。
 */
/**
 * 方案:(1)针对第1个原因,在使用Handler的组件生命周期结束前清除掉MessageQueue中的发送给Handler的Message对象(
 * 例如在Activity或Service的onDestroy
 * ()中调用Handler的remove*方法);(2)针对第2个原因,Handler的实现类采用静态内部类的方式
 * ,避免对外部类的强引用,在其内部声明一个WeakReference引用到外部类的实例。
 */

public class MainActivity extends Activity {
private MyHandler mHandler;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHandler = new MyHandler(this);

Thread t = new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub

}
});
t.start();
}


@Override
protected void onDestroy() {
/**
* removeCallbacks(Runnable r) ——清除r匹配上的Message。
* removeCallbacks(Runnable r, Object
* token)——清除r匹配且匹配token(Message.obj)的Message,token为空时,只匹配r。
* removeCallbacksAndMessages(Object token) ——清除token匹配上的Message。
* removeMessages(int what) ——按what来匹配 removeMessages(int what, Object
* object) ——按what来匹配
* 我们更多需要的是清除以该Handler为target的所有Message(包括Callback),那么调用如下方法即可
* handler.removeCallbacksAndMessages(null);
*/
mHandler.removeCallbacksAndMessages(null);


super.onDestroy();
}


static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<MainActivity> mOuter;


public MyHandler(MainActivity activity) {
mOuter = new WeakReference<MainActivity>(activity);
}


@Override
public void handleMessage(Message msg) {
MainActivity outer = mOuter.get();
if (outer != null) {
// Do something with outer as your wish.
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值