在我的Android应用程序中,我有列表视图和列表项详细信息视图。
Listview和详细信息视图是一个活动中的片段。 最初我将列表片段加载到活动中,如果用户点击列表项,它将使用详细信息片段替换相同的视图,并将该片段添加到一个活动中的 backstack 。
代码:
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = activity.getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
if ( !fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.main_place_holder, fragment, fragmentTag);
ft.addToBackStack(backStateName);
ft.commit();
}
如果用户点击后退按钮,它将进入列表视图,这样就可以了。
所以我的问题是,如果用户点击列表项应用程序崩溃多次(超过10次) OutOfMemory
我搜索并且有人说这是后台堆栈的正常行为,它不会清除内存中添加的碎片,即使这些碎片是从堆栈中加载的。
由于业务需求,我不能为此开展两项活动。
是不是我的方法列出了具有相同活动的列表和细节片段,并使用backstack以最佳方式回传导航?
如果不是我应该遵循的最佳选择?
答案 0 :(得分:-1)
然而,当片段放在后面的堆栈上时,它就是 onDestroyView()被调用。如果在那时你清理任何专业 片段保存的分配,你不应该有记忆 的问题。
参考此问题When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?
编辑: 覆盖片段上的setUserVisibleHint。这为您提供了一个很好的位置,可以确定在片段进入和退出视图时(例如,当您有从FragmentA切换到FragmentB的PagerAdapter时)在何处进行资源设置或清理资源。
public class MyFragment extends Fragment {
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
//you are visible to user now - so set whatever you need
initResources();
}
else {
//you are no longer visible to the user so cleanup whatever you need
cleanupResources();
}
}
}
您正在堆叠物品放在靠背堆上,因此预计至少会有一点内存占用,但是当碎片不在视图范围内时,您可以通过清理资源来最小化占用空间。以上技术。这可能是帮助