Как полностью уничтожить фрагмент диалога при утечке памяти? - PullRequest
1 голос
/ 29 марта 2020

У меня есть пустой фрагмент диалога. Чтобы получить утечку памяти, я добавил библиотеку LeakCanary в мое приложение. Когда откройте фрагмент диалога с этими командами:

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

и закройте его, LeakCanary покажет мне эту ошибку:

ScreenShot

Я пытаюсь добавить setRetainInstance в OnCreate метод и view = null в 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;
}
}

Как решить эту проблему?

1 Ответ

0 голосов
/ 31 марта 2020

вы можете открыть диалог следующим образом:

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