android - 为什么 Android 中的监听器不会造成内存泄漏?

标签 android android-layout

<分区>

下面是我阅读的有关为 Android Widgets 创建客户监听器的原型(prototype)代码。
我的问题是,如果父 View 将自己注册为“FooListener”并且父 View 维护对 FooWidget 的引用,为什么没有创建内存泄漏,因为 Widget 具有对其父项的引用并且父项可能具有引用到这个小部件?

包含 Activity 是否会在超出范围时以某种方式关闭其所有组成部分,即使其两个子项之间存在循环引用?

public class FooWidget extends View implements OnClickListener {

    private FooEventListener listener;
    public Button fooButton;
    public FooWidget(Context context) {
        super(context);
        fooButton = (Button) findViewById(R.id.myFooButton);
        fooButton.setOnClickListener(this);
     }
    public abstract class FooEventListener {
        public abstract void onFoo(View v);
    }
    public void registerListener(FooEventListener listener) {
        this.listener=listener;
    }
    @Override
    public void onClick(View v) {
        if (listener!=null) {
            listener.onFoo(this);
        }
    }

}

最佳答案

首先,如果父级将自己注册为 FooListener,这并不意味着它会自动维护对 FooWidget 的引用。即使是这样,循环引用也不会造成内存泄漏。如果两个对象都无法从 Activity 代码访问,那么即使它们相互引用,它们也会被 gc 处理。

关于android - 为什么 Android 中的监听器不会造成内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16820579/

相关文章:

android - 一旦应用程序进入后台,在一定持续时间后 flutter 运行代码?

android - FragmentPagerAdapter、 fragment 、support.v4 和 support.v13

java - 如何从我从 JavaClass 创建的 EditText 中获取文本

Android EditText 值替换提示

java - 如何从 Firebase 数据库获取数据并将它们填充到 ListView 中

android - 没有网络连接时应用崩溃

java - osmdroid - 更高的缩放级别?

java - Android音频FFT使用audiorecord检索特定频率幅度

android - AmazingListView 适配器未下载?

android - 用于具有多个子项目的项目列表的自定义适配器?