Handler 容易造成內存泄漏,結合WeakReference 弱引用有效減少內存泄漏的情況

常見內存泄露的原因

•非靜態匿名內部類和非靜態內部類會引用外部類。
•回調有可能會引起內存泄露,如果回調對象被靜態對象引用或者其他原因引用而無法釋放,就會導致內存泄露。
•非靜態Handler引用外部類引起內存泄露
•線程,動畫等無限循環執行,引用了需要釋放的對象,也會引起內存泄露
•靜態成員集合類和靜態View對象 以及靜態的非靜態成員變量
•單例類
•資源未關閉導致的泄露。

 

如果引用對象生命週期長於本來應該釋放的對象的話,那就會引起內存泄露(handle持有外部類Activity的引用,我們知道消息隊列是在一個Looper線程中不斷輪詢處理消息,那麼當這個Activity退出時消息隊列中還有未處理的消息或者正在處理消息,而消息隊列中的Message持有mHandler實例的引用,mHandler又持有Activity的引用,所以導致該Activity的內存資源無法及時回收,引發內存泄漏。


private WeakReferenceHandler handler = new WeakReferenceHandler(this);
private class WeakReferenceHandler extends Handler{

    WeakReference<AppCompatActivity> mActivityReference;

    public WeakReferenceHandler(AppCompatActivity activity){
        mActivityReference = new WeakReference<AppCompatActivity>(activity);
    }

    @Override
    public void handleMessage(@NonNull Message msg) {
        AppCompatActivity activity = mActivityReference.get();
        if (null != activity){
            //邏輯代碼
        }
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章