删除 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