删除 OLDEST 提交的返回堆栈片段
Remove OLDEST commited back stack Fragments
我有一个导航抽屉菜单(只有几个项目)调用切换片段,像这样:
FragmentTransaction trans = fragmentManager
.beginTransaction()
.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.replace(R.id.container, newFragment)
.addToBackStack(String.valueOf(item.Index)); // item.Index is clicked nav. drawer item index
trans.commit();
现在,当用户使用抽屉在应用程序中导航时,后台堆栈会不断增长。当堆栈中有很多项时(比如 > 30 或类似的东西),会占用一定数量的内存,我不喜欢这样,因为它有可能在某个时候达到临界点,我会得到 OOMException。
那么有什么方法可以从后台堆栈中删除最旧的项目吗?我不想使用 popBackStack()
(和类似的),因为它会删除最新的项目,我想删除第一个(最旧的)项目,因为用户可能不记得 he/she 在哪里之前是10次导航。
我认为你可以通过以下方式删除前 10 个片段
if (getSupportFragmentManager().getFragments() != null && getSupportFragmentManager().getFragments().size() > 30) {
Iterator itr = getSupportFragmentManager().getFragments().iterator();
int index = 0;
//REMOVE FIRST 10 fragments on Stack
while (itr.hasNext()) {
if (index < 10) {
itr.remove();
}else {
break;
}
index++;
}
}
我找到了某种解决方法,所以我会回答我自己的问题,也许有人会觉得它有用。
由于无法从 FragmentManager
中删除最旧的堆栈,我决定将其丢弃并使用我自己的 'back stack' 实现。
这里有更多详细信息:
http://stuffleftatparty.com/android-app-will-eat-its-entire-memory-by-design
我有一个导航抽屉菜单(只有几个项目)调用切换片段,像这样:
FragmentTransaction trans = fragmentManager
.beginTransaction()
.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
.replace(R.id.container, newFragment)
.addToBackStack(String.valueOf(item.Index)); // item.Index is clicked nav. drawer item index
trans.commit();
现在,当用户使用抽屉在应用程序中导航时,后台堆栈会不断增长。当堆栈中有很多项时(比如 > 30 或类似的东西),会占用一定数量的内存,我不喜欢这样,因为它有可能在某个时候达到临界点,我会得到 OOMException。
那么有什么方法可以从后台堆栈中删除最旧的项目吗?我不想使用 popBackStack()
(和类似的),因为它会删除最新的项目,我想删除第一个(最旧的)项目,因为用户可能不记得 he/she 在哪里之前是10次导航。
我认为你可以通过以下方式删除前 10 个片段
if (getSupportFragmentManager().getFragments() != null && getSupportFragmentManager().getFragments().size() > 30) {
Iterator itr = getSupportFragmentManager().getFragments().iterator();
int index = 0;
//REMOVE FIRST 10 fragments on Stack
while (itr.hasNext()) {
if (index < 10) {
itr.remove();
}else {
break;
}
index++;
}
}
我找到了某种解决方法,所以我会回答我自己的问题,也许有人会觉得它有用。
由于无法从 FragmentManager
中删除最旧的堆栈,我决定将其丢弃并使用我自己的 'back stack' 实现。
这里有更多详细信息: http://stuffleftatparty.com/android-app-will-eat-its-entire-memory-by-design