4

非常に単純な要件を持つ Google サポート ライブラリに基づいて、ダイアログ フラグメント用の小さな API を開発しました。

  • API はモーダル ダイアログを追加 (または置換) できます
  • API がプログラムでダイアログを閉じるか、ユーザーがボタンを押してダイアログを閉じることができます

私の API はバックスタックに常にフラグメントを追加することでメモリ リークを引き起こしますか?

public class DialogFragmentUtils {

private static final String DIALOG_TAG = "dialogTag";

public static void showDialogFragment(@Nullable Activity activity, @NotNull Fragment fragment) {
    if (activity instanceof FragmentActivity) {
        FragmentActivity fragmentActivity = (FragmentActivity) activity;
        FragmentManager fm = fragmentActivity.getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        Fragment prev = fm.findFragmentByTag(DIALOG_TAG);
        if (prev != null && prev.isAdded()) {
            ft.remove(prev);
        }
        ft.add(fragment, DIALOG_TAG);
        ft.addToBackStack(null);
        ft.commit();
    }
}

public static void dismissDialogFragment(@Nullable Activity activity) {
    if (activity instanceof FragmentActivity) {
        FragmentActivity fragmentActivity = (FragmentActivity) activity;
        FragmentManager fm = fragmentActivity.getSupportFragmentManager();
        DialogFragment dialog = (DialogFragment) fm.findFragmentByTag(DIALOG_TAG);
        if (dialog != null) {
            dialog.dismiss();
        }
    }
}
}
4

2 に答える 2

3

漏れることはないと思いますが、テストする必要があることを確認してください。talkol が言ったように、Eclipse MAT を使用してこの問題を分析する必要があります。こちらのvogel による優れたガイドと、こちらの Android ブログの優れたガイドがあります。一連のダイアログを作成して閉じ、違いが生じるかどうかを確認します。

ちなみに、メソッドft.close()の代わりに使用するのはなぜですか。ダイアログを閉じる正しい方法は.prev.dismiss()showDialogFragment()dismiss()

于 2013-07-30T20:30:56.007 に答える