自定義 Handler 時如何有效地避免內(nèi)存泄漏問題?

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

  將非靜態(tài)內(nèi)部類修改為靜態(tài)內(nèi)部類(靜態(tài)內(nèi)部類不會隱式持有外部類)

  當使用軟引用或者弱引用的時候,MainActivity難道很容易或者可以被GC回收嗎?
  GC回收的機制是什么?當MainActivity不被任何對象引用
  雖然Handler里面用的是軟引用/弱引用,但是并不意味著不存在其他的對象引用該MainActivity
  當MainAcitivity都被回收了,靜態(tài)內(nèi)部Handler中的弱/軟引用也就被回收了,handler也沒有存在的意義了
 private static class MyHandler extends Handler {
        //private Main2Activity mainActivity;//直接持有一個外部強引用,會引起內(nèi)存泄露
        private WeakReference<Main2Activity> mainActivity;//設(shè)置軟引用保存,當內(nèi)存一發(fā)生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:
                    //加載數(shù)據(jù)
                    //MainActivity.this.a;//有時候確實會有這樣的需求,需要引用外部類的資源,怎么辦
                    int b = main.a;
                    break;
            }

        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容