通过构造函数将上下文从主活动传递到 Java 类时获取"this field leaks a context object"



我的 MainActivity 类中有以下 2 行代码传递一个值:

RecyclerView mRecyclerView = findViewById(R.id.act_recyclerview);
new LoadText(this,mRecyclerView).execute();

在我的 LoadText 类中,我按如下方式使用:

private Context mContext;
private RecyclerView mRecyclerView;

public LoadText(Context context, RecyclerView recyclerView){
this.mContext=context;
this.mRecyclerView=recyclerView;
}

我的代码工作正常,但是当我将鼠标悬停在mContext和mRecyclerView上时,Android Studio会警告资源泄漏。我一直在寻找像我这样的类似问题的解决方案,有人建议通过构造函数传递值,这就是我正在做的事情,所以我不确定我是否理解为什么。

这是一个警告,这意味着系统知道可能有问题,但不能肯定地说 100%。

在这种情况下,问题是您的LoadText对象的生存期有多长。如果它的生存期超过您传递给它的ActivityRecyclerView,则代码将导致内存泄漏:LoadText 具有对活动的强引用,这将防止它被垃圾回收。

如果您作为人类知道您的LoadText对象的寿命永远不会超过活动(或只会在短时间内存活),那么您可以安全地忽略此警告。另一方面,如果LoadText对象存在很长时间,它可能会使您的活动永远保持活力。

实际上,泄露单个活动并不是世界末日。但是,如果您经常执行此类操作,最终您的应用程序将耗尽内存并崩溃。

僵尸活动也有可能最终执行您意想不到的代码(可能是 LoadText 类在其上调用方法),这可能会导致不良行为或崩溃。

最新更新