1

因此,我对 android 中的内存泄漏进行了大量研究,并阅读了许多 StackOverflow 帖子。我仍然不明白的是,根据 Medium 和 StackOverflow 帖子(下面提到的链接),如果我将活动的上下文传递给 Recyclerview 的适配器并将其作为全局变量存储在适配器中,我的活动与适配器是仍然有资格进行垃圾收集。这是因为没有 GC 根引用适配器或我的活动(一旦它被销毁),因此两者都将被垃圾收集(Example1). 但是,为什么内部类不适用相同的情况?我知道他们持有对其持有类的隐式引用,但是如果活动(在这种情况下为持有类)被破坏并且即使内部类仍在执行一些异步任务,不应该没有指向任何GC 根他们?(控股或内部阶级)所以他们都应该得到垃圾收集?(例 2)

示例 1:(在活动被破坏后有资格获得 GC):

public class MyAdaptor extends RecyclerView.Adaptor<>{

public Context context;

public MyAdaptor(Context context){
this.context=context;
}

}



public MyActivity extends AppCompatActivity {
private MyAdaptor myAdaptor;    

@Override
protected void onCreate(Bundle savedInstanceState) {
//some code
myAdaptor=new MyAdaptor(this);
}

}

示例 2:(活动被销毁后不符合 GC 条件):

public MyHoldingActivity extends AppCompatActivity {
private MyInnerClass myInnerClass;    

@Override
protected void onCreate(Bundle savedInstanceState) {
myInnerClass=new MyInnerClass();
}

class MyInnerClass{
//executing some long Async Task
}

}

我提到的两个帖子的链接如下: https ://medium.com/@oznusem/circular-dependency-in-android-should-i-worry-about-it-814660ac79ec

在 RecyclerView.Adapter 中保留 Context/Activity 实例是否安全?

对不起,如果我没有把我的问题说清楚,这是我在 StackOverflow 上的第一篇文章。

4

1 回答 1

0

假设AsyncTask有对您的内部类的引用,则:

如果 an 的内部类正在运行Activityan AsyncTask,即使完成了,ActivityGC 也无法回收参考. 但是,一旦完成,GC 可以回收 ,因为内部线程管理器将不再引用.ActivityActivityAsyncTaskAsyncTaskAsyncTaskActivityAsyncTask

这并不是真正的内存泄漏,因为它只是暂时的情况。Activity最终将被回收。当 GC永远无法回收对象时,就会发生真正的“内存泄漏” 。最终,此类内存泄漏会消耗所有可用内存,并导致长时间运行的应用程序崩溃并出现OutOfMemoryException.

您可以通过取消您的AsyncTask内部来防止这种onDestroy()情况Activity

希望这能回答你的问题。

于 2020-05-13T11:17:45.367 回答