2

いくつかのフラグメントを使用してソーシャル アプリを開発しています。グリッド ビューを含む Friend フラグメントが 1 つあります。1 つの項目をクリックすると、プロファイル フラグメントが開き、バック スタックに追加されます。次に、プロファイル フラグメントで、ユーザーは引き続き新しいフレンド フラグメントを入力し、それをバック スタックなどに追加できます。したがって、バック スタックは、フレンド a -> プロファイル b -> フレンド c -> プロファイル d -> フレンド e のようになります。 -> プロファイル f -> ...

だから私の質問は、ユーザーがいくつかのレベルに入り、いくつかのフラグメントをバックスタックに入れることができ、一部のフラグメントには多くの画像ビューがあるため、メモリ使用量を減らして OOE を回避するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

1

これは、ソーシャル メディア アプリの典型的な問題です。商用のソーシャル メディア アプリの多くを見ると、あなたが言及したプロセスを経てそれらをクラッシュさせることができます。メモリの管理に関するいくつかの考えは、フラグメントを追加するときにメモリ使用量を常にチェックすることです。そして、特定の制限に達すると、以前のフラグメントをスラッシングするか、ユーザーに警告するかを決定します。最大の問題の 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()); 
    }
}

幸運を。

于 2014-02-11T19:44:46.657 に答える