美文网首页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