Android: 使用 ArrayAdapter 的强引用循环
Android: Strong reference cycle using ArrayAdapter
在我尝试为我的应用程序中的所有适配器抽象出通用功能时,我在查看困扰我的 ArrayAdapter 代码时遇到了一些问题。
据我所知,使用 ListView 的常见模式如下:
- 在 XML 中创建 ListView,它将在 Activity 中有一个引用。
- 创建一个 ArrayAdapter 并将 Activity 作为其上下文。
- 在 ListView 中设置 ArrayAdapter。
看一眼代码就会发现 ListView 存储了对适配器的强引用,而 ArrayAdapter 存储了对上下文的强引用,即我的 Activity。这创建了一个强大的引用循环,这让我有点困扰。
我知道这可以通过在 onDestroy 中将 ListView 引用设置为 null 来解决。但是在使用导致它的相同技术的任何教程中从未讨论过这个问题。
我的问题是我在这里遗漏了什么还是这是常识?
ARC 不是 Java/Android 使用的真正的 GC(垃圾收集器),因此它们具有不同的行为。其中一种行为是,对于 ARC,由开发人员来打破任何循环引用以防止内存泄漏,但这对 Android 来说不是问题,其 GC 可以在运行时自动检测此类引用并适当地处理这些对象。
深入了解平台的底层工作原理总是好的,这些信息可能会帮助您区分两者并对 GC 有一些了解:
- Does iOS 5 have garbage collection?
- Java Garbage Collection Basics(它适用于 Oracle Java,但提供了对 GC 的一般概念理解)
- A Closer Look at Android RunTime (ART) in Android L
在我尝试为我的应用程序中的所有适配器抽象出通用功能时,我在查看困扰我的 ArrayAdapter 代码时遇到了一些问题。
据我所知,使用 ListView 的常见模式如下:
- 在 XML 中创建 ListView,它将在 Activity 中有一个引用。
- 创建一个 ArrayAdapter 并将 Activity 作为其上下文。
- 在 ListView 中设置 ArrayAdapter。
看一眼代码就会发现 ListView 存储了对适配器的强引用,而 ArrayAdapter 存储了对上下文的强引用,即我的 Activity。这创建了一个强大的引用循环,这让我有点困扰。
我知道这可以通过在 onDestroy 中将 ListView 引用设置为 null 来解决。但是在使用导致它的相同技术的任何教程中从未讨论过这个问题。
我的问题是我在这里遗漏了什么还是这是常识?
ARC 不是 Java/Android 使用的真正的 GC(垃圾收集器),因此它们具有不同的行为。其中一种行为是,对于 ARC,由开发人员来打破任何循环引用以防止内存泄漏,但这对 Android 来说不是问题,其 GC 可以在运行时自动检测此类引用并适当地处理这些对象。
深入了解平台的底层工作原理总是好的,这些信息可能会帮助您区分两者并对 GC 有一些了解:
- Does iOS 5 have garbage collection?
- Java Garbage Collection Basics(它适用于 Oracle Java,但提供了对 GC 的一般概念理解)
- A Closer Look at Android RunTime (ART) in Android L