一:原因:当我们在activity里面使用一个继承handler类的时候,如果我们点击了返回按钮,这个子handler还没有处理完消息,就会持有当前activity,导致这个activity没有被及时释放,从而导致内存泄漏。
二:解决方法:
1:把该handler设置为静态内部类。
2:通过弱应用(WeakReference)的方式,让handler持有外部类的应用。
由此避免内存泄漏
三:代码
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView mTextView;
private WeakReference<MainActivity> activityWeakReference;
private MyHandler myHandler;
static class MyHandler extends Handler {
private MainActivity activity;
MyHandler(WeakReference<MainActivity> ref) {
this.activity = ref.get();
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
//需要做判空操作
if (activity != ) {
activity.mTextView.setText("new Value");
}
break;
default:
Log.i(TAG, "handleMessage: default ");
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在onCreate中初始化
activityWeakReference = new WeakReference<MainActivity>(this);
myHandler = new MyHandler(activityWeakReference);
myHandler.sendEmptyMessage(1);
mTextView = (TextView) findViewById(R.id.tv_test);
}
四:除了上面这种办法,一般常用的是:在activity被销毁的时候,及时清除消息,从而及时回收activity,避免内存泄露
@Override
protected void onDestroy() {
super.onDestroy();
if(myHander!=null){
myHander.removeCallbacksAndMessages(null);
}
}
注意:单纯的在ondestory里面清楚消息并不保险,因为ondestory并不一定执行。一般情况下都会执行ondestory,但是当滑动卡片删除,或者通过应用管理杀死进程的时候只有栈里面的第一个没有销毁的activity执行ondestroy方法,一般都是mainActivity,其它activity均不执行ondestroy