Android常见问题总结

问题:非静态Handler可能引起的内存泄露

原因:通过handler发送的runnable对象,会被进一步包装为message对象,或者是直接发送的Message对象,会被放入消息队列。当这个Activity被finished后,延时发送的消息会继续在主线程的消息队列中存活10分钟,直到他们被处理。这个message持有handler对象,这个handler对象又隐式持有着Activity对象,直到消息被处理前,这个handler对象都不会被释放, 因此Activity也不会被释放。这个匿名Runnable类对象也一样。匿名类的非静态实例持有一个隐式的外部类引用,因此Activity将被泄露。
参考文章:http://blog.csdn.net/lsyz0021/article/details/51473819
解决办法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private static class MyHandler extends Handler {
private WeakReference<Activity> weakReference;
private MyHandler(Activity activity) {
weakReference = new WeakReference<>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity activity = null;
if (weakReference.get() instanceof MainActivity) {
activity = (MainActivity) weakReference.get();
}
if (activity == null) {
return;
}
//do something
}
}