android – 我应该在AsyncTask中使用WeakReference或Application Context吗?

前端之家收集整理的这篇文章主要介绍了android – 我应该在AsyncTask中使用WeakReference或Application Context吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有点陷入两难境地,我希望你们可以帮助我.

正如您所看到的,我有一个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();
}
原文链接:https://www.f2er.com/android/430093.html

猜你在找的Android相关文章