android - 包含引用好/坏的属性

标签 android

我是 Android/Java 的新手(通常使用 PHP 和 JavaScript)。我读过几篇关于当引用被错误使用时应用程序内存泄漏问题的文章,所以我对我在其他人的工作中经常看到的东西有疑问。

很多人,当他们需要以多种方法访问诸如 View 之类的东西时,会在创建 Activity 期间分配的属性中保留对此的引用。从我读过的(或者至少理解我读过的)来看,这是内存泄漏的类(class)之一?

为对象分配一个ID,然后在每个方法中搜索它们是否更好?如果是这样,那么动态创建的对象呢?

最佳答案

如果你正确地使用它们会很好,如果你不正确的话就会很糟糕。

只有当您将 Activity 之外的内容传递给另一个类并且该类的生命周期大于 Activity 的生命周期时,才会发生泄漏。一旦 Activity 不再是前台 Activity,并且如果 Activity 之外的某些东西持有对它的引用,Android 可能会销毁它,那么垃圾收集器就无法将内存释放回堆中。

要特别注意 Activity 上下文、静态和单例。

简单地在 Activity 中保留对 View 的引用是绝对正常的。

这里有一个不好的例子(伪代码);

public class MyApplication extends Application{
    public static ImageView activityBackgroundImageView;
}

public class MyActivity extends Activity{

    ImageView iv = findViewById(R.id.myImageView);
    myApplication.activityBackgroundImageView= iv; // <==== LEAK

}

实际上,泄漏并不存在,它仅在(如果)myActivity 完成()或销毁时泄漏。

每个对象都有一个引用计数——有多少对象持有对它的引用。在您的 Activity 中设置对 ImageView 的引用后,引用计数为 1。然后将该引用复制到 Application 类。注意。 Java 中的所有内容都是按值传递的,因此您传递引用的值,恰好是该值的副本 - 即对同一对象的新引用。 ImageView 上的引用计数现在是两个。

一段时间后,您 finish() 您的 Activity 并且引用计数减少。现在是一个。垃圾收集器无法释放该 ImageView 对象,因为它具有非零引用计数。

当然,您可以通过使应用程序中的引用为空来修复它,但您现在有意大利面条代码。

关于android - 包含引用好/坏的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13703400/

相关文章:

android - 使用 setFilters 时,EditText maxLength 属性未正确应用

javascript - 如何从缓冲区渲染数据? react native Javascript

java - APK 不会在 android 模拟器上运行。 (不幸的是应用程序已停止)

android - 如何为基于光标的分页实现 PagingSource.getRefreshKey - Android Jetpack Paging 3

java - 在 recyclerview 中选择项目时如何从 Firebase 中删除值?

Android 在 RecyclerView OnClickListener 中获取 firebase 推送 ID

java - Hashmap 到 ArrayList 的 For 循环未保存正确的值。怎么修?

java - 无限滚动图库的文本自定义

Android 时钟与 Windows 同步

android - 搜索 View 未显示在工具栏中