删除OLDEST提交的后台堆栈碎片

时间:2017-03-07 12:44:59

标签: android android-fragments memory fragmentmanager

我有一个导航抽屉菜单(只有几个项目)调用切换片段,如下所示:

 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。

那么有没有办法从后台堆栈中删除OLDEST项目?我不想使用popBackStack()(和类似的),因为它将删除最新的项目,我想摆脱第一个(最旧的)项目,因为用户可能不记得他/她在哪里10导航更早。

2 个答案:

答案 0 :(得分:1)

我找到了某种解决方法,所以我会回答我自己的问题,也许有人会觉得它很有用。

由于无法从FragmentManager删除最旧的堆栈,因此我决定抛弃它并使用我自己的“后台堆栈”实现。

此处有更多详情: http://stuffleftatparty.com/android-app-will-eat-its-entire-memory-by-design

答案 1 :(得分:0)

我认为您可以按照以下方式删除前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++;
        }
    }