gpt4 book ai didi

android - 我应该在 AsyncTask 中使用 Wea​​kReference 还是 Application Context?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:51:55 26 4
gpt4 key购买 nike

我有点进退两难,希望大家能帮帮我。

如你所见,我有一个 AsyncTask我在其中保存了一些代码 Bitmap将对象作为 .jpg 文件添加到图库中。在AsyncTask我也在使用 Context ,但据我所知,使用 Activity 的上下文在这个内部类中可能会导致内存泄漏,所以我将其更改为 WeakReference<Context> weakContext;所以垃圾收集器可以收集它。

但是通过使用 Application我从传递的 View 中获得的上下文从构造函数我应该归档与弱上下文引用相同的效果

那么在这种情况下使用哪个更好呢?

public class ViewToBitmap {

private View view;
private WeakReference<Context> weakContext;

public ViewToBitmap(@NonNull View view) {
this.view = view;
}

// This?
private WeakReference<Context> getContext() {
weakContext = new WeakReference<>(view.getContext());
return weakContext;
}

// Or This?
private Context getContext() {
return view.getContext().getApplicationContext();
}

private class AsyncSaveBitmap
extends AsyncTask<Void, Void, Void>
implements MediaScannerConnection.OnScanCompletedListener {

@Override
protected Void doInBackground(Void... params) {
//TODO: Save bitmaps to gallery
//CONTEXT IS USED HERE
getContext().get()
return null;
}
}

最佳答案

由于 View 对象显式引用了 Context,它在 View 膨胀时使用,您实际上保持了对 Context View 的硬引用,在 ViewToBitmap 的实例中添加。

此外,由于 AsyncSaveBitmap 不是 static,因此此类的实例隐式引用了 ViewToBitmap 的封闭实例。

最终结果是,只要 AsyncSaveBitmap 存在,就会有一个对 Activity 的硬引用链,这将阻止该 Activity 的 GC >.

因此,答案是:这两种方法都不够好。

最好的方法是重构逻辑,这样长时间运行的代码就不会引用ContextActivityView

实现这一目标的最直接方法是使用观察者设计模式或发布-订阅设计模式 - 这样您就可以在生命周期方法(例如 onStop())中“注销”,因此删除潜在危险的引用并防止内存泄漏。

编辑:

对于库而言,您不一定需要特定的 Context 并且应用程序的 Context 就足够了,可以使用以下模式(取决于您的库是否公开是否为单例):

// 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 中使用 Wea​​kReference<Context> 还是 Application Context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41747441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com