为什么Android中的监听器没有创建内存泄漏?

时间:2013-05-29 17:43:43

标签: android android-layout

在原型代码下面,我读到了为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);
        }
    }

}

1 个答案:

答案 0 :(得分:3)

首先,如果父将自己注册为FooListener,那并不意味着它保持对FooWidget的引用。即使它确实如此,循环引用也不会产生内存泄漏。如果两个对象都无法从活动代码中访问,那么即使它们相互引用它们也会被gc'ed。