Утечка памяти фрагмента нижнего листа

Я использую утечку, и он говорит, что ваш фрагмент нижнего листа протекает. Но я не вижу, в чем проблема.

Как я могу исправить эту утечку?

public class TokensExplainedFragment extends BottomSheetDialogFragment implements HasSupportFragmentInjector {

    private static final String TAG = "TokensExplainedFragment";
    private View mainView;

    @Inject
    DispatchingAndroidInjector<Fragment> childFragmentInjector;

    @Inject
    SessionManager sessionManager;

    @Inject
    ViewModelProviderFactory providerFactory;

    public TokensExplainedFragment() {
    }

    @Override
    public void onAttach(Context context) {
        AndroidSupportInjection.inject(this);
        super.onAttach(context);
    }

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

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mainView = inflater.inflate(R.layout.fragment_tokens_explained, container, false);
        return mainView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        BottomSheetDialog dialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);


        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                BottomSheetDialog d = (BottomSheetDialog) dialog;

                FrameLayout bottomSheet = (FrameLayout) d.findViewById(com.google.android.material.R.id.design_bottom_sheet);
                BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
            }
        });

        return dialog;
    }

    @Override
    public AndroidInjector<Fragment> supportFragmentInjector() {
        return childFragmentInjector;
    }
}

Вот как я это начинаю:

TokensExplainedFragment bottomSheetFragment = new TokensExplainedFragment();
bottomSheetFragment.show(getActivity().getSupportFragmentManager(), bottomSheetFragment.getTag());

След утечки:

введите описание изображения здесь


person Tolgay Toklar    schedule 15.11.2019    source источник
comment
github.com/square/leakcanary/issues/1628   -  person Vis    schedule 20.11.2019


Ответы (2)


Согласно источникам Android, ConnectivityThread:

Общий поток одноэлементного подключения для системы. Это поток для операций подключения, таких как подключения AsyncChannel к системным службам. Различные объекты диспетчера подключений могут использовать этот синглтон в качестве общего ресурса для своих обработчиков вместо создания собственных отдельных потоков.

Здесь мы видим, что этот поток запущен, а сообщение, отправленное ему и выполняющееся в данный момент в этом потоке, имеет ссылку на TokensExplainedFragment.

Я подозреваю, что TokensExplainedFragment делает больше, чем то, что используется в StackOverflow (например, какой-то код с использованием sessionManager), и в этом дополнительном коде может быть что-то, вызывающее системную службу подключения (например, Wi-Fi, Интернет, Bluetooth и т. Д.). Это, вероятно, вызывает отложенную публикацию сообщения в ветке подключения, и это сообщение должно быть отменено, но этого не происходит.

person Pierre-Yves Ricau    schedule 19.11.2019

getSupportFragmentManager и getFragmentManager являются менеджерами фрагментов на верхнем уровне Activity. Для управления фрагментами на уровне фрагментов используйте getChildFragmentManager

bottomSheetFragment.show(getChildFragmentManager(), bottomSheetFragment.getTag());
person Giddy Naya    schedule 15.11.2019