大佬教程收集整理的这篇文章主要介绍了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.getcontext());>
此外,由于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,请注明来意。