3

在我阅读的原型代码下方,用于为 Android Widgets 创建客户侦听器。
我的问题是,如果父视图将自身注册为“FooListener”并且父视图维护对 FooWidget 的引用,为什么不创建内存泄漏,因为 Widget 具有对其父视图的引用,而父视图可能具有引用到这个小部件?

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

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);
        }
    }

}
4

1 回答 1

4

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

于 2013-05-29T17:52:28.633 回答