1. 程式人生 > >【達內課程】Android中的GC垃圾回收機制與記憶體洩漏

【達內課程】Android中的GC垃圾回收機制與記憶體洩漏

在這裡插入圖片描述
當main()方法執行完,main()方法中的區域性變數都會彈棧,從棧當中銷燬
當左側棧中的e2和e銷燬後,右側中的兩個物件就是垃圾
java底層有一種GC垃圾回收機制,在java程式執行時,GC執行緒會不斷找尋垃圾,是的話會清除掉
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
當我們點選模擬機的返回鍵時,發生了什麼
在這裡插入圖片描述
當GC想回收Activity時,發現被Adapter引用
在這裡插入圖片描述
當GC想回收Adapter時,發現有一條阻塞的執行緒
在這裡插入圖片描述
當我們點選手機的返回鍵時,Activity並不會被銷燬,當再開啟時,我們觀察執行的執行緒,會增加一條。返回再開啟,又會增加執行緒…
如何檢視工作的執行緒
在這裡插入圖片描述
在這裡插入圖片描述
解決辦法如下:
在NewMusicListFragment中重寫onDestroy()方法

  @Override
    public void onDestroy() {
        //把adapter中的執行緒銷燬
        adapter.stopThread();
        super.onDestroy();
    }

MusicAdapter中增加stopThread()方法

    public void stopThread() {
        //isLoop為false,迴圈停止
        isLoop = false;
        //當我們按返回鍵時,執行緒在wait(),應先喚醒
        synchronized (workThread) {
            workThread.notify();
        }
    }

重複剛才操作,不會新增執行緒
在這裡插入圖片描述