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