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

4

是的,它容易出现内存不足,但不会出现内存泄漏。所有回栈Fragment都通过硬引用保存在内存中。因此,如果您Fragment在后堆栈中保留了荒谬的 s 数量,那么您将耗尽内存。

看看这里:当片段被替换并放入后堆栈(或删除)时,它是否保留在内存中?

更新:我看到你DIALOG_TAG没有改变,所以你一次只Fragment在后台保留一个,因为如果旧的存在的话,你会删除它。在这种情况下,您可能不会遇到内存不足的问题。

于 2013-07-31T21:40:50.527 回答
3

我相信它不会泄漏,但要确保您需要对其进行测试。正如talkol所说,您应该使用Eclipse MAT来分析这个问题。vogel在这里有一个很好的指南,Android 博客上有一个很好的指南。创建并关闭一堆对话框,看看它是否有所作为。

在旁注中,您为什么使用ft.close()而不是prev.dismiss()在您的showDialogFragment()方法中。关闭对话框的正确方法是dismiss().

于 2013-07-30T20:30:56.007 回答