单例模式应用普遍,全局只有一个对象,生命周期和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生命周期,导致的内存泄漏。