如何为内存泄漏问题完全销毁对话片段?

How to destroy a dialog fragment completely for memory leak issue?

我有一个空的对话片段。为了获取内存泄漏问题,我将 LeakCanary 库添加到我的应用程序中。使用此命令打开对话框片段时:

DialogFragment fragment = TabsFragment.newInstance();
fragment.setStyle(DialogFragment.STYLE_NO_FRAME, R.style.DialogFragments);
fragment.show(getSupportFragmentManager(), "MyFragment");

然后关闭它,LeakCanary 告诉我这个错误:

ScreenShot

我尝试在 OnCreate 方法中添加 setRetainInstance 并在 [=] 中添加 view = null 27=]onDestroyView。但是内存泄漏错误仍然显示。

这是我的片段:

public class TabsFragment extends DialogFragment {

private View view;

public static TabsFragment newInstance() {
    return new TabsFragment();
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.my_fragment, container, false);
    return view;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    dismiss();
    view = null;
}
}

如何解决这个问题?

你可以这样打开对话框:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.add(TabsFragment.newInstance(), "Fragment");
ft.addToBackStack(null);
ft.commit();

然后在你的对话框片段的 onDismiss 方法中,写下这段代码:

FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (fragmentManager.getBackStackEntryCount() > 0)
    fragmentManager.popBackStack();
fragmentTransaction.commit();