【问题标题】:How to destroy a dialog fragment completely for memory leak issue?如何完全销毁对话框片段以解决内存泄漏问题?
【发布时间】:2020-03-29 17:59:47
【问题描述】:

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

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

然后关闭它,LeakCanary 显示这个错误:

ScreenShot

我尝试在 OnCreate 方法中添加 setRetainInstance,在 onDestroyView 中添加 view = null。但是那个内存泄漏错误仍然出现。

这是我的片段:

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;
}
}

如何解决这个问题?

【问题讨论】:

    标签: android memory-leaks


    【解决方案1】:

    你可以像这样打开对话框:

    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();
    

    【讨论】:

    • 谢谢你,我的兄弟!我用这种方式,没有任何内存泄漏的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2012-05-23
    • 2012-08-19
    • 2011-05-28
    • 1970-01-01
    • 2010-12-11
    • 2022-12-01
    相关资源
    最近更新 更多