场景:在Handler工作流程中,假设MessageQueue中还存有待发送的消息,在这时用户关闭了程序,将会导致内存泄漏,Activity的生命周期结束,但是MessageQueue还持有Activity的引用,此时GC无法对Activity进行回收。
解决方案:
1.在onDestroy()方法里面清空MessageQueue。
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
// 外部类Activity生命周期结束时,同时清空消息队列 & 结束Handler生命周期
}
2.静态内部类 + 弱引用,内部重写handler,将Activity定义为弱引用,handler持有的对象改为弱应用下的Activity。
private static class FHandler extends Handler{
// 定义 弱引用实例
private WeakReference<Activity> reference;
// 在构造方法中传入需持有的Activity实例
public FHandler(Activity activity) {
// 使用WeakReference弱引用持有Activity实例
reference = new WeakReference<Activity>(activity); }
// 通过复写handlerMessage() 从而确定更新UI的操作
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
Log.d(TAG, "收到线程1的消息");
break;
case 2:
Log.d(TAG, " 收到线程2的消息");
break;
}
}
}
184

被折叠的 条评论
为什么被折叠?



