handler内存泄漏原因有两个:

第一:

public final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
load(url);
handler.sendEmptyMessage(1);
}
}).start();

}
子线程耗时操作,当用户回到home,子线程还在运行,handler非静态内部类,持有外部类的引用,导致MainActivity无法回收,造成内存泄漏;


第二:
public final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.postDelayed(new Runnable() {
@Override
public void run() {
load(url);
}
},1000*60*5);

}
handler延时执行,5分钟之内,MainActivity回收不了,造成内存泄漏。

解决方法 第一种:
   public MyHandler(MainActivity activity) {
this.mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
MainActivity mainActivity = mActivity.get();
if (mainActivity == null) {
return;
}
//code

}
}
private final MyHandler mHandler = new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
@Override
public void run() {
load(url);
mHandler.sendEmptyMessage(1);
}
}).start();

}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(1);
}

解决方法 第二种:
private static class MyHandler extends Handler{
private final WeakReference<MainActivity> mActivity;

public MyHandler(MainActivity activity) {
this.mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
// super.handleMessage(msg);
MainActivity mainActivity = mActivity.get();
if (mainActivity == null) {
return;
}
//code

}
}
private static final Runnable MyRunnable = new Runnable() {
@Override
public void run() {

}
};

private final MyHandler mHandler = new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler.postDelayed(MyRunnable,1000*60*5);

}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(MyRunnable);
}







posted on 2017-09-22 14:04  跳动的米  阅读(167)  评论(0编辑  收藏  举报