大家都知道,在很久之前,谷歌就发出警告This Handler class should be static or leaks might occur,不要在Activity中直接 new 一个Handler使用,因为这样创建Handler是一个内部类,会默认持有外部类的引用,就是Activity的引用,可能造成内存泄漏,类似于这样:
什么情况下会造成内存泄漏呢?比如你在Activity中使用了postDelay方法,延迟的操作还没有执行,但是用户点击返回键退出了这个Activity,按照正常的程序这个Activity应该被销毁,但是由于Handler持有Activity引用,导致Activity无法被回收,就会导致内存泄漏。所以在新版本的Android Studio上,只要是直接创建内部类Handler的,都会有一片黄色警告,谷歌的建议是把Handler做成静态内部类,因为静态内部类不持有外部类的引用,就不会造成内存泄漏。
但是Handler做成静态内部类不能直接访问外部类的资源,所以要怎么办呢?这时候就需要用到弱引用了。
我们可以写一个通用的父类Handler,然后在具体的Handler创建的时候继承它,就可以避免内存泄漏,省时省力:
这个父类Handler代码如下:
public class StaticHandler<T> extends Handler {
private static final String TAG = "StaticHandler";
protected WeakReference<T> ref;
public StaticHandler(T t) {
super();
ref = new WeakReference<T>(t);
}
@Override
public void handleMessage(Message msg) {
final T t = ref.get();
if (t == null) {
Log.w(TAG, "ref.get is null");
return;
}
handleMessage(msg, t);
}
protected void handleMessage(Message msg, T t) {
}
}
在Activity中是这样使用的:
这样可以消除黄色警告,又可以避免内存泄漏。
记住,创建Handler继承于StaticHandler别忘了static关键字,这个很重要,必须是静态内部类才能避免内存泄漏