【发布时间】:2014-06-09 14:26:08
【问题描述】:
我的应用程序存在架构问题。我已经使用了一个带有导航抽屉和几个片段的活动。现在,
假设我有两个片段 A 和 B 。导航结构有点:
一个
A1
A2
B
B1
B2
其中 A1,A2 属于 A 类型片段,B1,B2 属于 B 类型片段。相同类型的片段之间的唯一区别,例如。 A1,A2 是数据。
我的第一个方法:
每当用户点击 A1,A2,B1,B2 时。我只是创建一个该类型的新实例并替换片段。
Fragment fragment =A.newInstance();
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
mDrawerLayout.closeDrawer(rlDrawer);
}
注意:我不想将它们添加到后台堆栈。
后来我意识到这种方法效率低下,因为每次它都会在该片段上创建一个新实例,即使它们是相同的类型。正如我之前所说,差异仅在于数据。所以,我转向下一种方法
第二种方法:
现在我的活动有 Fragment A 和 B 的数据成员(引用)。现在我将检查它是否为空,然后创建一个新实例,否则只需更改数据:
if (A == null) {
a = A.newInstance();
} else {
((A) a).changeData();
}
replaceFragment(a);
这种方法的问题是,当我从片段 A1 切换到 B1 时,A1 片段被破坏,但它的引用仍然保留在活动中。现在,当我从 B1 切换回 A1 时,它不会像您在上面的代码中看到的那样创建新实例,但同时在 Fragment A 上调用 onCreate() 方法。
我是否应该在 Fragment 上调用 onDestroy() 后立即从活动中删除引用?
我的第二种方法正确吗?
有没有更好的方法呢?
提前致谢。
【问题讨论】:
标签: android performance android-fragments android-fragmentactivity navigation-drawer