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

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 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,654评论 0 8
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,415评论 0 12
  • 一.Java内存分配结构复习 1.Java内存分配策略 上一篇Android内存管理分析总结中我们提到了Java内...
    Geeks_Liu阅读 832评论 5 7
  • Kotlin 内存泄漏初探 写在前面: 最近在学习熟悉号称Android第一语言的--Kotlin,作为一名...
    Gflyer阅读 5,211评论 3 12
  • 遇见的每个人,都是一种缘分。有些人走着走着就散了,有些人走着走着就走进了生命里,不论是何种结局,都应珍惜每一个当下...
    lin晓霞阅读 207评论 0 0