android - 是否可以将 Activity 传递给非 Activity 类?

标签 android performance android-activity

我阅读了很多帖子(其中一篇是 this )和文章,根据这些文章,您不应将 contextActivity 传递到非 Activity 类,以避免内存泄漏。

我必须在非 Activity 类中使用方法findViewById()。 到目前为止,我这样做了:

    public class Text{

        Activity activity;

        public Text(Activity activity){
           this.activity = activity;
        }

        public TextView getMyTextView(){
           return activity.findViewById(R.id.textView1)
        }

    }

现在我想知道即使“传递”一个 Activity 是否也会导致内存泄漏。 例如,在非 Activity 类中调用 findViewById 方法的最佳方式是什么。

最佳答案

唯一可能导致内存泄漏的是对 GC 工作原理的误解。避免内存泄漏的基本规则是确保应由 GC 收集的对象与 GC Root 断开连接:

enter image description here

有一组GC根,其中一个是静态字段。因此,如果您将 Activity 分配给此类字段,则 GC 无法收集它:

class ActivityRef {

 public static Activity ref;

 public static void setActivity(Activity activity){
    ActivityRef.ref = activity;
 }
}

此 Activity (包含所有 View 、位图和所有连接的对象)将保留在内存中,直到应用程序未被系统终止。

另一个GC根是Thread

class SomeThread extends Thread{

  Activity ref;

  public void setActivity(Activity activity){
    this.ref = activity;
  }
}

当线程处于 Activity 状态时,GC 无法收集 Activity 实例。

因此,没有最好的方式或方法来调用 findViewById 来避免内存泄漏,有一个内存模型描述了 GC 的工作原理,如果您遵循这些规则,您将永远不会出现内存泄漏。更多 here .

关于弱引用的好文章:

关于android - 是否可以将 Activity 传递给非 Activity 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912993/

相关文章:

android - 如何在 android 中使用内部 expat XML 解析器?

android - Android 上的简单 Web 服务器

java - 将InputStream复制到OutputStream的更好方法

python - 通过调整负项来限制 numpy 数组中的项总和

android - 如何在 Android 平板电脑上制作专用的交 key 应用程序

android - 如何向 Activity 添加自定义 View ?

c# - 我该如何优化这个功能? c# 扫描文本文件中的字符串

android - 在 AlertDialog 中使用 onTouchEvent

安卓 : Eclipse Juno

android - 如何在 java 代码中管理 UI?