0

私は、3 つのタブで構成されるアクティビティを持つアプリ (私が作成したものではありません) に取り組んでおり、それぞれが独自のフラグメントに対応しています (以前にフラグメントを使用したことはありません)。各タブ/フラグメントには、大量のメモリを消費するデータ構造が表示されます。あるタブから別のタブに切り替えたときに、発信タブ/フラグメントによって消費されたメモリが完全に解放されていることを確信したい. 次が始まる前に。

たとえば、発信フラグメントによって表示されているビットマップがあったとします。フラグメントがすべてのメモリを解放したことを確認するために、最初に bitmap.release() を実行することが不可欠でしょうか?

4

1 に答える 1

0

タブコントローラーでタブ変更イベントをリッスンします。

tabLayout.setOnTabChangedListener(<listener>);

リスナーのコールバック メソッドで(onTabChanged(int index, boolean isUserInput))、前のフラグメントを取得し、そのビューで再帰的な方法でアンバインド ドローアブルを呼び出します (それを記述する必要があります)。それを行った後、Dalvik VM にヒントを与えてガベージ コレクターを実行するように呼び出すこともできますSystem.gc()(単なるヒントであり、保証はありません)。

バインド解除のサンプル コード:

public static void unbindDrawables(@Nullable View view) {
    if (view == null) {
        return;
    }

    if (view.getBackground() != null) {
        view.getBackground().setCallback(null);
    }

    if (view instanceof ImageView && ((ImageView) view).getDrawable() != null) {
        ((ImageView) view).getDrawable().setCallback(null);
    }

    if (view instanceof ViewGroup) {
        if (view instanceof AbsListView) {
            // Clean out list view
            List<View> cells = Lists.newLinkedList();
            ((AbsListView) view).reclaimViews(cells);
            if (cells != null) {
                for (View c : cells) {
                    unbindDrawables(c);
                }
            }
        } else {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
        }
    }
}
于 2013-03-16T21:32:40.180 に答える