2

我正在开发一个包含多个片段的社交应用程序。有一个 Friend 片段包含一个网格视图。如果我单击一个项目,然后打开一个 Profile 片段,并将其添加到后堆栈中。然后在 Profile 片段中,用户仍然可以输入一个新的 Friend 片段,并将其添加到后栈中,等等。所以后栈可以是 Friend a -> Profile b -> Friend c -> Profile d -> Friend e -> 配置文件 f -> ...

所以我的问题是,既然用户可以进入几个层级,把几个fragment放到back stack中,而有些fragment有很多imageviews,如何减少内存使用,避免OOE呢?

提前致谢。

4

2 回答 2

2

您可能只有一种真正的方法 - 限制后退堆栈!这是一篇如何做到这一点的帖子:How to limit the number of the same Activity on the stack for an Android application

此致

苹果浏览器

PS:也看看这里:http: //developer.android.com/guide/components/tasks-and-back-stack.html


看这里,这就是你需要做的:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}

你也可以使用这样的东西:

FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

希望这可以帮助。

此致

于 2013-01-03T14:31:45.723 回答
1

这是社交媒体应用程序的经典问题。如果您查看许多商业社交媒体应用程序,您将能够通过您提到的过程使它们崩溃。关于管理内存的一些想法是在添加片段时始终检查内存使用情况。当你达到某个限制时,要么决定破坏以前的片段,要么警告用户。随着用户进一步深入研究,最大的问题之一与每个片段中的内容有关。如果您在每个片段中加载了许多图像(通常是社交媒体的情况),那么您可能会考虑在用户进一步导航时删除片段中保存的图像。当他们使用后退按钮返回时,片段将然后从服务器重新加载图像。

还要记住,当您使用后退按钮向后导航时,堆栈弹出不会从内存中删除片段。您还必须显式调用 remove 然后执行 GC 以确保在您回溯时将其删除。

在这里,我有一个 HashMap Stack 的示例,用于保存与 Tab 关联的片段。像这样的东西,

    private void popFragments(){

    if(mStacks.get(currentTab)!=null && mStacks.get(currentTab).size()>1){ 

        FragmentManager fm = getSupportFragmentManager();
        Fragment currentFrag=mStacks.get(currentTab).pop();

            // This is the part that will reclaim the memory
        if(currentFrag.isAdded()){
            fm.beginTransaction().detach(currentFrag).commit();
            fm.beginTransaction().remove(currentFrag).commit();
        }
        currentFrag=null;
        System.gc();
        Fragment newFrag=mStacks.get(currentTab).lastElement();
        if(newFrag !=null && newFrag.isAdded()){
            fm.beginTransaction().attach(newFrag).commit();
        }
        else if(newFrag !=null && !newFrag.isAdded()){
            fm.beginTransaction().add(R.id.fragment_content, newFrag,newFrag.getTag()).commit();
            fm.beginTransaction().attach(newFrag).commit();
        }
        actionbar.setLargeTitle(newFrag.getTag()); 
    }
}

祝你好运。

于 2014-02-11T19:44:46.657 回答