Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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.getcontext()); return="" weakcontext;="" }="" or="" this?="" private="" context="" getcontext()="" {="" return="" view.getcontext().getapplicationcontext();="" }="" private="" class="" asyncsavebitmap="" extends="">
最佳答案
由于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();
}

大佬总结

以上是大佬教程为你收集整理的android – 我应该在AsyncTask中使用WeakReference或Application Context吗?全部内容,希望文章能够帮你解决android – 我应该在AsyncTask中使用WeakReference或Application Context吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。