これは、ソーシャル メディア アプリの典型的な問題です。商用のソーシャル メディア アプリの多くを見ると、あなたが言及したプロセスを経てそれらをクラッシュさせることができます。メモリの管理に関するいくつかの考えは、フラグメントを追加するときにメモリ使用量を常にチェックすることです。そして、特定の制限に達すると、以前のフラグメントをスラッシングするか、ユーザーに警告するかを決定します。最大の問題の 1 つは、ユーザーがさらに深く掘り下げる際の各フラグメントの内容に関連しています。各フラグメントに多数の画像がロードされている場合 (通常はソーシャル メディアの場合)、ユーザーがさらにナビゲートするときに、フラグメントに保持されている画像をスラッシングすることを検討できます。戻るボタンを使用して戻ると、フラグメントは次のようになります。次に、サーバーから画像をリロードします。
また、戻るボタンを使用して後方に移動すると、スタック ポップによってフラグメントがメモリから削除されないことにも注意してください。また、remove を明示的に呼び出してから GC を実行して、後戻りしたときに確実に削除されるようにする必要があります。
ここに、タブに関連付けられたフラグメントを保持する HashMap スタックの例があります。このようなもの、
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());
}
}
幸運を。