美文网首页
使用Handler请注意内存泄漏

使用Handler请注意内存泄漏

作者: ztzt123 | 来源:发表于2018-02-26 16:14 被阅读0次

handler使用的很频繁,但使用的过程中需要注意,Handler使用不当,很容易造成内存泄露,在我们的代码中会看到很多这样的写法:

   Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg) {
           ....
       }
   };
   handler.sendEmptyMessageDelayed(1,1000);

看起来使用很方便,但这样写很明显的内存泄露。handler发送的消息会放在消息队列中,在这个消息被处理之前会持有Handler的引用,这个Handler由于是非静态内部类,这样这个Handler也会持有Activity的引用,这样就造成了destroy的时候,无法正常释放Activity,所以在使用Handler的时候需要注意两点,有延时操作的时候需要在Destroy的时候调用

Handler.removeCallbacksAndMessages(null);

对于静态内部类的问题,需要使用弱引用保证内存可以正常释放。

static class MessageHandler extends Handler {
        final WeakReference<WelcomeActivity> mActivityWeakReference;

        MessageHandler(WelcomeActivity welcomeActivity) {
            mActivityWeakReference = new WeakReference<>(welcomeActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            if (mActivityWeakReference.get() != null && !CompatibleUtils.isDestroyed(mActivityWeakReference.get())) {
                WelcomeActivity welcomeActivity = mActivityWeakReference.get();
                switch (msg.what) {
                    case MSG_WELCOME:
                        welcomeActivity.startMovie();
                       break;
                }
            }

        }
    }

public abstract class NoLeakHandler<T> extends Handler {
    private Reference<T> reference;

    public NoLeakHandler(T t, boolean isSoft) {
        if (isSoft) {
            reference = new SoftReference<T>(t);
        } else {
            reference = new WeakReference<T>(t);
        }
    }

    @Override
    public void handleMessage(Message msg) {
        if (reference == null || reference.get() == null) {
            return;
        }
        handleMessageNoLeak(msg, reference.get());
    }

    public abstract void handleMessageNoLeak(Message msg, T t);
}

相关文章

  • 使用Handler请注意内存泄漏

    handler使用的很频繁,但使用的过程中需要注意,Handler使用不当,很容易造成内存泄露,在我们的代码中会看...

  • java基础

    Handler怎样防止内存泄漏 handler引起内存泄漏的原因:由于handler的写法问题,如果handler...

  • Handler

    一,什么是handler 二,handler的使用 三,handler机制原理 四,handler引起的内存泄漏和...

  • 重谈Handler的内存泄漏

    Handler 的内存泄漏问题 在多线程操作中,handler会使用的非常多,但是每次使用handler你有没有考...

  • 重谈Handler的内存泄漏

    Handler 的内存泄漏问题 在多线程操作中,handler会使用的非常多,但是每次使用handler你有没有考...

  • Android Handler 内存泄漏分析&解决方案

    一、前言 我们在开发过程中,经常使用 Handler,而使用 Handler 很容易造成内存泄漏,Android ...

  • Android的垃圾回收与内存泄露

    标签(空格分隔): Android 内存泄漏的基本知识请见博客一如何高效使用handler避免内存泄漏请见博客二 ...

  • EditText延迟搜索

    使用Handler的延迟发送实现: 一般使用Handler会有一个内存泄漏的提示: 可以使用WeakReferen...

  • Handler的正确使用,防止内存泄漏

    如果Handler使用不当,会导致内存泄漏,直至内存溢出。因此,为了避免这种情况的发生,Handler要定义为st...

  • 2018-04-18 Handler的基本用法

    1.Handler实现原理: 2.为了防止使用Handler导致内存泄漏,所以采用静态内部类MyHandler 使...

网友评论

      本文标题:使用Handler请注意内存泄漏

      本文链接:https://www.haomeiwen.com/subject/lcmyxftx.html