單例模式應用普遍,全局只有一個對象,生命週期和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生命週期,導致的內存泄漏。