Backstack和内存泄漏

时间:2013-07-21 23:38:37

标签: android fragment

我开发了一个基于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();
        }
    }
}
}

2 个答案:

答案 0 :(得分:4)

是的,它容易出现内存不足,而不是内存泄漏。所有后向堆栈Fragment都使用硬引用保存在内存中。因此,如果你在后台堆叠中保留了大量的Fragment s,那么你将会失去记忆。

看看这里:When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?

更新:我发现您的DIALOG_TAG没有变化,因此您一次只能在后台堆叠中保留一个Fragment,因为如果存在,则删除旧的{{1}}。在这种情况下,您可能没有内存不足的问题。

答案 1 :(得分:3)

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

另外注意为什么在ft.close()方法中使用prev.dismiss()代替showDialogFragment()。关闭对话框的正确方法是dismiss()