底页碎片内存泄漏

时间:2019-11-15 13:31:48

标签: android memory-leaks leakcanary

我正在使用泄漏漏斗,它说您的底片碎片正在泄漏。但我看不出问题出在哪里。

我该如何解决该泄漏?

fun Resources.getQuantityText(
        id: Int,
        quantity: Int,
        vararg formatArgs: Any
): CharSequence {
    return HtmlCompat.fromHtml(
            getQuantityString(id, quantity, *formatArgs),
            HtmlCompat.FROM_HTML_MODE_COMPACT
    )
}

这是我的启动方式:

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

泄漏跟踪:

enter image description here

2 个答案:

答案 0 :(得分:0)

getSupportFragmentManagergetFragmentManager都是顶级Activity上的片段管理器。要在片段级别内管理片段,请使用getChildFragmentManager

bottomSheetFragment.show(getChildFragmentManager(), bottomSheetFragment.getTag());

答案 1 :(得分:0)

根据Android sources,ConnectivityThread为:

  

系统的共享单例连接线程。这是一个线程    连接操作,例如与系统服务的AsyncChannel连接。     各种连接管理器对象可以将此单例用作公共对象     处理程序的资源,而不是创建自己的单独线程。

在这里,我们可以看到该线程正在运行,并且在该线程上执行并正在执行的消息引用了TokensExplainedFragment。

我怀疑TokensExplainedFragment的功能远不止StackOverflow中共享的功能(例如,使用sessionManager编写的一些代码),在那段额外的代码中,可能会有一些调用连接系统服务的事情(例如,wifi,互联网,蓝牙等)。这可能会导致向连接线程发送延迟的消息,并且该消息应被取消,但不是。