我在旧的旧系统中找到了这段代码,如果没有问题,我也不想碰它。
但是我觉得这段代码有一些缺陷,我找不到它。这是不常见的模式,还是存在一些隐患或内存泄漏?
private static final Foo action = new Foo() {
@Override
public void onAction(MyDialogFragment fragment) {
if (fragment.getContext() != null) {
fragment.getActivity().finish();
}
}
};
此代码用于片段
更新: 我怀疑匿名内部类的对象具有对父片段的引用,并且由于此类的对象保存在静态字段中,因此它将永远不会被收集,因此父片段也将不会被收集。我的推理错了吗?
答案 0 :(得分:3)
该方法没有错,因为逻辑仅处理作为参数传递的值。使用静态方法只是避免创建Foo类的多个实例。
答案 1 :(得分:1)
是的。最好得到这样的片段:
MyDialogFragment fragment = MyDialogFragment.instance();
fragment.setNavigator(this);
getSupportFragmentManager().beginTransaction().replace(R.id.activity_myDialog_layout, fragment).commit();
有一个更好的方法。您可以创建3个类以及将由这3个类实现的接口。活动,片段和演示者。该界面将是“合同”。这是更高级的。
答案 2 :(得分:0)
最佳解释在这里: https://stackoverflow.com/a/27739694/5868421
静态上下文中的匿名类不包含对外部对象的引用。