Android WeakReference 处理内存泄漏
Android WeakReference to handle memory leakage
请检查以下代码,
我们可以在 Utils class 中使用像下面这样的 WeakReferences 来处理上下文内存泄漏吗?
private static final String TAG = "Utils";
private static Utils instance;
private Context context;
public Utils(WeakReference<Context> context) {
this.context = context.get();
}
public static synchronized final Utils getInstance(Context context) {
if (instance == null) {
instance = new Utils(new WeakReference<Context>(context));
}
return instance;
}
private WeakReference<Context> context;
在构造函数中:(如果你想创建单例,请将其设为私有 class)
this.context = context;
其他一切看起来都不错。
您可以使用 Leak Canary 检查内存泄漏。它做同样的事情,但只有一行代码。它会告诉你每次内存泄漏的根源。
不,WeakReference 可以在任何时候 return null,所以它使这种毫无意义。
您将在每次访问 WeakReference 时检查它是否为 null,然后您将需要通过在方法参数中提供上下文来处理这种情况,因此无需将上下文存储在领域。
更好(但不是最好)的解决方案是使用 ApplicationContext,context.getApplicationContext()
,可能最好的方法是将上下文传递到每个方法调用中。
请检查以下代码, 我们可以在 Utils class 中使用像下面这样的 WeakReferences 来处理上下文内存泄漏吗?
private static final String TAG = "Utils";
private static Utils instance;
private Context context;
public Utils(WeakReference<Context> context) {
this.context = context.get();
}
public static synchronized final Utils getInstance(Context context) {
if (instance == null) {
instance = new Utils(new WeakReference<Context>(context));
}
return instance;
}
private WeakReference<Context> context;
在构造函数中:(如果你想创建单例,请将其设为私有 class)
this.context = context;
其他一切看起来都不错。
您可以使用 Leak Canary 检查内存泄漏。它做同样的事情,但只有一行代码。它会告诉你每次内存泄漏的根源。
不,WeakReference 可以在任何时候 return null,所以它使这种毫无意义。
您将在每次访问 WeakReference 时检查它是否为 null,然后您将需要通过在方法参数中提供上下文来处理这种情况,因此无需将上下文存储在领域。
更好(但不是最好)的解决方案是使用 ApplicationContext,context.getApplicationContext()
,可能最好的方法是将上下文传递到每个方法调用中。