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

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

概述我有点陷入两难境地,我希望你们可以帮助我.正如您所看到的,我有一个AsyncTask,其中我有一些代码将Bitmap对象作为.jpg文件保存到库中.在AsyncTask中我也使用了Context,但据我所知,在这个内部类中使用Activity的上下文会导致内存泄漏,因此我将其更改为WeakReference< Context> weakContext;所以垃

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

正如您所看到的,我有一个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 Singletonprivate 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 useprivate final Context mAppContext;public MylibraryEntryClass(Context context) {    mAppContext = context.getApplicationContext();}
总结

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1139464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)