在原型代码下面,我读到了为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);
}
}
}
答案 0 :(得分:3)
首先,如果父将自己注册为FooListener,那并不意味着它保持对FooWidget的引用。即使它确实如此,循环引用也不会产生内存泄漏。如果两个对象都无法从活动代码中访问,那么即使它们相互引用它们也会被gc'ed。