【內存泄漏】Android內存泄漏---單例內存泄漏

單例模式應用普遍,全局只有一個對象,生命週期和Application一樣長。


那麼問題來了,生命週期問題,可能導致內存泄漏。


舉個栗子:

存在內存泄漏(context對象)

public class Single{

    private static Single instance;

    private Context context;

    private Single(Context context) {

        this.context = context;

    }

    public static Single getInstance(Context context) {

        if (instance != null) {

            instance = new Single(context);

        }

        return instance;

    }

}


修改:

public class Single{

    private static Single instance;

    private Context context;

    private Single(Context context) {

        this.context = context.getApplicationContext();

    }

    public static Single getInstance(Context context) {

        if (instance != null) {

            instance = new Single(context);

        }

        return instance;

    }

}


兩段代碼的區別,在於context和context.getApplicationContext()。前者可能是Acticity的Context對象,後者肯定是Application的Context對象,Activity的Context生命週期 ≤ ApplicationContext生命週期。


爲什麼前者會泄露?
當Activity退出,程序沒退出,context對象本該隨着Activity的退出,被處理掉。


NO!!!context仍然被單例持有。new Single(context),context沒用了,然而還佔着內存,出現內存泄漏。


解決方式:
new Single(context.getApplicationContext()),這樣,不管傳入什麼Context,最終使用Applciation的Context,避免了Activity生命週期,導致的內存泄漏。




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