android - 底部片断内存泄漏
问题描述
我正在使用leakcanary,它说你的底部片断正在泄漏。但我看不出问题出在哪里。
我怎样才能解决这个泄漏?
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());
泄漏痕迹:
解决方案
getSupportFragmentManager
并且getFragmentManager
都是顶级 Activity 的片段管理器。用于管理片段级别内的片段使用getChildFragmentManager
bottomSheetFragment.show(getChildFragmentManager(), bottomSheetFragment.getTag());