https://www.jianshu.com/p/25364c424095
问题:
单例持有Activity或其他Context的强引用
单例的生命周期和应用(Application)的生命周期一样长
当此Activity退出时,Activity应该被回收,可是这个单例持有这个activity的强引用,导致回收失败,所以造成内存泄漏。
public
class GlobalManager {
private
volatile
static GlobalManager instance;
private Context mContext;
private GlobalManager(Context context) {
this.mContext = context;
}
public static GlobalManager getInstance(Context context) {
if (instance ==
null) {
synchronized (GlobalManager.class) {
if (instance ==
null) {
instance =
new GlobalManager(context);
}
}
}
return instance;
}
}
解决方法:
我们不管传入的是Context还是ApplicationContext,我们都将它转换为ApplicationContext,这样这个单例就不会持有Activity或其他Context的强引用了
public
class GlobalManager {
private
volatile
static GlobalManager instance;
private Context mContext;
private GlobalManager(Context context) {
this.mContext = context.getApplicationContext();
}
public static GlobalManager getInstance(Context context) {
if (instance ==
null) {
synchronized (GlobalManager.class) {
if (instance ==
null) {
instance =
new GlobalManager(context);
}
}
}
return instance;
}
}