zoukankan      html  css  js  c++  java
  • Android Handler leak 分析及解决办法

    静态内部类只能访问外部类的静态成员,因为非静态成员必须依附于某个具体的对象,而静态内部类不需要要

    静态内部类可以直接实例化,不需要绑定到外部类上再去实例化

    handler出现泄漏的两个原因:

    1)message没有清楚干净

    2)handler持有的主线程的COntext实例

    解决方案:

    1) message:在Context的destroy的时候利用handler.removeCallbacksAndMessages(null)来清除

    2)静态内部类+WeakReference

    public class MyActivity extends Activity {
        private MyHandler mHandler;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
     
            mHandler = new MyHandler(this);
        }
     
        @Override
        protected void onDestroy() {
            // Remove all Runnable and Message.
           mHandler.removeCallbacksAndMessages(null);
     
            super.onDestroy();
        }
     
        static class MyHandler extends Handler {
         private WeakReference<MyActivity> mOuter;
    
            public MyHandler(MyActivity activity) {
                mOuter = new WeakReference<MyActivity>(activity);
            }
     
            @Override
            public void handleMessage(Message msg) {
                MyActivity outer = mOuter.get();
                if (outer != null) {
                    // Do something with outer as your wish.
                }
            }
        }
    }
  • 相关阅读:
    文本标记
    第一个HTML文档
    HTML入门
    bootstrap fileinput 文件上传
    DPDK rte_hash 简述
    glib学习笔记-基本知识
    linux常用网络命令
    libevent学习过程
    C语言 singleton模式
    oracle命令行导出、导入dmp文件
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/4914038.html
Copyright © 2011-2022 走看看