文章目錄
- 問題
- 解決方法
- 拓展
問題
在Android開發中,經常會將工具類以單例模式的方法實現,而工具類中又總不可避免的用到 Context
,例如:
public class MySingleton {private static volatile MySingleton instance;private final Context ctx;private MySingleton(Context context) {ctx = context;}public static MySingleton getInstance(Context context) {if (instance == null) {synchronized (MySingleton.class) {if (instance == null) {instance = new MySingleton(context);}}}return instance;}
}
那么就會出現:
Warning: Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)
包括 Google 自己的單例模式使用舉例都會有這個錯誤……
解決方法
這是因為普通 Activity
的 Context
的生命周期未必有 final Context ctx
(實際上是static MySingleton
) 長,因此有內存泄漏的風險。
查閱了大量資料后,解決方法主要參考這里,最終的代碼實現如下:
public class MySingleton {private static volatile MySingleton instance;private final Context ctx;private MySingleton(Context context) {// 調用 getApplicationContext()// 返回當前進程的單個全局應用程序對象的上下文。// 這意味著 getApplicationContext() 返回的上下文將貫穿整個程序ctx = context.getApplicationContext();}public static MySingleton getInstance(Context context) {if (instance == null) {synchronized (MySingleton.class) {if (instance == null) {instance = new MySingleton(context);}}}return instance;}
}
拓展
Android設計模式(一)單例模式
單例模式雙重鎖中volatile的作用