我有点陷入两难境地,我希望你们可以帮助我.
正如您所看到的,我有一个AsyncTask,其中我有一些代码将Bitmap对象作为.jpg文件保存到库中.在AsyncTask中我也使用了Context,但据我所知,在这个内部类中使用Activity的上下文会导致内存泄漏,因此我将其更改为WeakReference< Context> weakContext;所以垃圾收集器可以收集它.
但是通过使用我从构造函数传递的View获得的Application上下文,我应该归档与弱上下文引用相同的效果
那么在这种情况下使用比其他更好吗?
public class ViewToBitmap {
private View view;
private WeakReference
最佳答案
由于View对象具有对视图通胀时使用的Context的显式引用,因此通过保持对View的硬引用,您实际上在ViewToBitmap的实例中保留了对Context的“传递”硬引用.
此外,由于AsyncSaveBitmap不是静态的,因此该类的实例具有对ViewToBitmap的封闭实例的隐式引用.
最终结果是,只要存在AsyncSaveBitmap,就会有一系列对Activity的硬引用,这将阻止该Activity的GC.
所以,答案是:两种方法都不够好.
最好的方法是重构逻辑,使得没有长时间运行的代码引用Context,Activity,View等.
实现这一目标的最直接方法是使用Observer设计模式或Publish-Subscribe设计模式 – 这样您就可以在生命周期方法(例如onStop())中“取消注册”,从而删除潜在危险的引用并防止内存泄漏.
编辑:
出于库的目的,您不一定需要特定的Context和应用程序的Context就足够了,可以使用以下模式(取决于您的库是否公开为Singleton):
// Use this approach if clients will use your library as Singleton
private static Context sAppContext;
public static void init(Context context) {
sAppContext = context.getApplicationContext();
}
// Use this approach if clients will instantiate your library's object on each use
private final Context mAppContext;
public MyLibraryEntryClass(Context context) {
mAppContext = context.getApplicationContext();
}