Android写一个通用的安全无内存泄漏的Handler

大家都知道,在很久之前,谷歌就发出警告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关键字,这个很重要,必须是静态内部类才能避免内存泄漏

发布了27 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/shving/article/details/102540083
今日推荐