自定義 Handler 時如何有效地避免內存泄漏問題?

解決方案:
step 1.自定義的靜態handler
step 2.可以加一個弱引用
step 3.還有一個主意的就是當你activity被銷毀的時候如果還有消息沒有發出去 就remove掉吧
step 4.removecallbacksandmessages去清除Message和Runnable 加null 寫在生命周的ondestroy()就行

  將非靜態內部類修改為靜態內部類(靜態內部類不會隱式持有外部類)

  當使用軟引用或者弱引用的時候,MainActivity難道很容易或者可以被GC回收嗎?
  GC回收的機制是什么?當MainActivity不被任何對象引用
  雖然Handler里面用的是軟引用/弱引用,但是并不意味著不存在其他的對象引用該MainActivity
  當MainAcitivity都被回收了,靜態內部Handler中的弱/軟引用也就被回收了,handler也沒有存在的意義了
 private static class MyHandler extends Handler {
        //private Main2Activity mainActivity;//直接持有一個外部強引用,會引起內存泄露
        private WeakReference<Main2Activity> mainActivity;//設置軟引用保存,當內存一發生GC的時候就會回收

        public MyHandler(Main2Activity mainActivity) {
            this.mainActivity = new WeakReference<Main2Activity>(mainActivity);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Main2Activity main = mainActivity.get();
            if (main == null || main.isFinishing()) {
                return;
            }

            switch (msg.what) {
                case 0:
                    //加載數據
                    //MainActivity.this.a;//有時候確實會有這樣的需求,需要引用外部類的資源,怎么辦
                    int b = main.a;
                    break;
            }

        }
    }
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容