美文网首页Android开发Android技术知识Android开发
Handler内存泄漏原因及解决方案

Handler内存泄漏原因及解决方案

作者: TTLLong | 来源:发表于2019-04-30 16:38 被阅读15次

    Handler内存泄漏原因及解决方案

    目录:
    image.png
    1.须知:
    1. 主线程Looper生命周期和Activity的生命周期一致。
    2. 非静态内部类,或者匿名内部类。默认持有外部类引用。
    2.原因:

    Handler造成内存泄露的原因。非静态内部类,或者匿名内部类。使得Handler默认持有外部类的引用。在Activity销毁时,由于Handler可能有未执行完/正在执行的Message。导致Handler持有Activity的引用。进而导致GC无法回收Activity。

    3.可能造成内存泄漏
    1. 匿名内部类:
        //匿名内部类    
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
            }
        };
    
    1. 非静态内部类:
        //非静态内部类
        protected class AppHandler extends Handler {
    
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    // TODO: 2019/4/30  
                }
            }
        }
    
    4.解决方法:
    1. Activity销毁时,清空Handler中,未执行或正在执行的Callback以及Message。
        // 清空消息队列,移除对外部类的引用
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mHandler.removeCallbacksAndMessages(null);
    
        }
    
      
        //Handler源码中removeCallbacksAndMessages()注释含义
        /**
         * Remove any pending posts of callbacks and sent messages whose
         * <var>obj</var> is <var>token</var>.  If <var>token</var> is null,
         * all callbacks and messages will be removed.
         */
        public final void removeCallbacksAndMessages(Object token) {
            mQueue.removeCallbacksAndMessages(this, token);
        }
    
    1. 静态内部类+弱引用
        private static class AppHandler extends Handler {
            //弱引用,在垃圾回收时,被回收
            WeakReference<Activity> activity;
    
            AppHandler(Activity activity){
                this.activity=new WeakReference<Activity>(activity);
            }
    
            public void handleMessage(Message message){
                switch (message.what){
                    //todo
                }
            }
        }
    
    5. 其他:

    即使内存泄漏了。待handler中的消息处理完。下次GC时即可回收本次未回收的内存。

    相关文章

      网友评论

        本文标题:Handler内存泄漏原因及解决方案

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