2 つのタブで表示しているため、私のアプリケーションにはいくつかのフラグメントが含まれています。最初のタブに分類されたフラグメントはほとんどなく、2 番目のタブに表示される別のカテゴリに分類されたフラグメントもほとんどありません。また、ウェブから取得される多くの画像もあります。ビットマップへの WeakReference または SoftReference を使用せずに、画像の概念の遅延読み込みを使用しています。アプリケーションは問題なく非常にうまく機能します。しかし、長時間操作するとクラッシュします。ヒープの更新を追跡したところ、以下が見つかりました。
新しいフラグメントにアクセスすると、ヒープ サイズが増加し、それらをスタックから削除してもヒープ サイズは減少しません。古いフラグメントにアクセスすると、ヒープ メモリが大幅に増加することはありませんが、メモリの増加はほとんどありません。フラグメントがスタックから削除されたときに、ヒープ メモリがメモリを再利用しない理由。すべてのフラグメント onDestroy() が呼び出されたにもかかわらず、メモリが再利用されていないすべてのフラグメントからログをトレースしています。その後のメモリの増加により、最終的に OutOfMemoryError が発生し、ビットマップが VM の予算を超えているというエラーが発生し、VM が n バイトのサイズを割り当てることができません。
すべてのフラグメントには、リソースに保存されている高品質の 3 種類の背景画像があります。各フラグメントの onDestroy() で unbindDrawables を実行しています。ビットマップ イメージを使用するために、メモリをヒープ メモリの 5 分の 1 に制限しました。それでも OOME が来て、すべてのドアが閉ざされており、解決策を見つけることができません。
以下は、フラグメント ナビゲーションに使用するサンプル コードです。
FragmentManager fm = getFragmentManager();
if(fm!=null)
{
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.llfirst, fragments1);//if second tab ft.replace(R.id.llsecond,fragments2);
ft.addToBackStack(null);
ft.commit();
}
最後に、もう 1 つの質問は、アプリケーションで使用されるフラグメントの数に制限があるということです。