我想让Android应用程序更少内存昂贵
并且奇怪有没有办法重用一个片段的实例而不重新创建它?
在我的应用程序中,我有一些片段(内存昂贵)
并且用户通常在它们之间导航很多次。
使用背堆不能让我达到预期目的
例如,如果我以这种方式向后堆栈添加事务:
FragA - > FragB - > FragC - > FragD
当用户使用popBackStack("FragA.class.getSimpleName()", 0)
返回FragA(应用程序中的主菜单)时,
我失去了FragB - > FragC - > FragD实例。
然后当用户导航方向相同时:
FragA - > FragB - > FragC - > FragD
最后3个片段必须再次创建。
我尝试过这里建议的解决方案:
Can fragment be created with only one instance
How to keep only one instance of a fragment, when switching with NavigationDrawer?
但他们都没有帮助。
我最终得到了这个解决方案,但它仍然不起作用:
private FragmentManager mFragmentManager;
private HashMap<String, Fragment> mFragmentsMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragmentManager = getSupportFragmentManager();
mFragmentsMap = new HashMap<>();
// ...
}
public void switchFragment(Fragment fragment) {
// getting Fragment name
String fragmentName = fragment.getClass().getSimpleName();
// checking whether fragment has been created
Fragment usedFragment = mFragmentsMap.get(fragmentName);
FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
if (usedFragment == null) {
// don't have fragment created
// creating new one and putting to the map
fragmentTransaction.replace(R.id.contentPanel, fragment, fragmentName);
mFragmentsMap.put(fragmentName, fragment);
} else {
// having needed Fragment created
// so reusing it
fragmentTransaction.replace(R.id.contentPanel, usedFragment, fragmentName);
}
fragmentTransaction.commit();
}
在这种情况下,有趣的情况发生了:
如果来自FragD我想使用
返回FragA
switchFragment(FragA);
HashMap已经拥有FragA实例,我正在替换它
带有usedFragment的容器(来自上面的方法),
但不知何故,FragA再次被创造出来。
我错过了什么?