Android Handler很容易造成内存泄漏,平时工作时也经常遇到。常见的处理方法如下:

使用弱引用(WeakReference):

创建一个弱引用到你的Activity或Fragment,这样即使Handler还在运行,也不会导致内存泄漏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.ref.WeakReference;

public class MyHandler extends Handler {
private final WeakReference<ActivityOrFragment> mActivityOrFragment;

public MyHandler(ActivityOrFragment activityOrFragment) {
mActivityOrFragment = new WeakReference<>(activityOrFragment);
}

@Override
public void handleMessage(Message msg) {
ActivityOrFragment activity = mActivityOrFragment.get();
if (activity != null) {
// 更新UI
}
}
}

在Activity或Fragment销毁时移除消息队列:

确保当Activity或Fragment销毁时,所有的Handler消息都被移除,以防止Handler尝试执行任何操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
使用HandlerThread:

如果你正在使用后台线程与Handler通信,可以使用HandlerThread,它是一个具有Looper的Thread,可以用来处理后台操作,并且在Activity或Fragment销毁时调用handlerThread.quit()来结束线程。

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());

@Override
protected void onDestroy() {
super.onDestroy();
handlerThread.quit();
}