美文网首页Android
Android 消息机制(自定义 Handler 防内存泄漏)

Android 消息机制(自定义 Handler 防内存泄漏)

作者: sunorign | 来源:发表于2019-10-24 23:43 被阅读0次

    Kotlin 实现

    kotlin 中处在其他类中,没有标记 inner 的类为嵌套类,标记了 inner 的类为内部类。只有内部类才会带有一个对外部类的对象的引用。因此, WeakHandler 无需声明为静态

    class MyActivity : AppCompatActivity() {
        val handler = WeakHandler(this)
    
        class WeakHandler(activity: Activity) : Handler() {
            private val weakReference = WeakReference(activity)
            override fun dispatchMessage(msg: Message) {
                weakReference.get()?.let {
                    //todo
                }
            }
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
             //...
            Thread(Runnable {
                handler.sendMessageAtTime(...);
            }).start()
        }
    }
    

    Java 实现

    首先, handler 必须是静态内部类实现,其次要弱引用外部对象

    public class MyActivity extends Activity {
        private WeakHandler handler;
        static class WeakHandler extends Handler {
            private Activity activity;
            WeakHandler(WeakReference<Activity> weakReference){
                activity = weakReference.get();
            }
            @Override
            public void handleMessage(@NonNull Message msg) {
                //todo
            }
        }
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    handler.sendMessage();
                }
            }).start();
        }
    }
    

    内存泄漏的原因

    生命周期长的持有了生命周期短的引用

    常见的内存泄漏

    1. 资源对象没关闭造成的内存泄漏(如: Cursor、File等)
    2. 接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus
    3. Activity 的 Context 造成的泄漏,可以使用 ApplicationContext
    4. 单例中的static成员间接或直接持有了activity的引用
    5. 全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合)

    参考

    [1]risechen.一般什么情况下会导致内存泄漏问题[EB/OL].https://github.com/Moosphan/Android-Daily-Interview/issues/3
    [2]Moosphan,Shanlovana,zhaoyujie.自定义 Handler 时如何有效地避免内存泄漏问题[EB/OL].https://github.com/Moosphan/Android-Daily-Interview/issues/1

    相关文章

      网友评论

        本文标题:Android 消息机制(自定义 Handler 防内存泄漏)

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