当我们的activity里有handler对象时,有时候会因为handler对activity的持有而导致activity无法被回收,引发oom。
这时我们有三种方法可以处理:
1,弱引用,根据java的gc机制,弱引用不会影响系统对该对象的回收。
class MyHandler extends Handler{
WeakReference<Activity> mActivity;
public MyHandler(Activity con){
this.mActivity = new WeakReference<Activity>(con);
}
public void handleMessage(android.os.Message msg) {
if(msg.what == 1 ){
Toast.makeText(Activity.this, "toast", 1000).show();
send();
}
};
}
2.将Handler声明为静态类。
静态类不持有外部类的对象,所以你的Activity可以随意被回收
static class MyHandler extends Handler{
public void handleMessage(android.os.Message msg) {
if(msg.what == 1 ){
Toast.makeText(HandlerNull.this, "toast", 1000).show();
send();
}
};
}
3.通过程序逻辑去除引用handler的业务。
如在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。2如果你的Handler是被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列移除就行了。