【问题标题】:Android/Java: why does my ConstraintLayout leak?Android/Java:为什么我的 ConstraintLayout 泄漏?
【发布时间】:2019-05-15 13:00:31
【问题描述】:

根据 LeakCanary 的说法,我的应用存在内存泄漏

这是MyFragmentConstraintLayout。我正在尝试通过将onDestroyView() 中的View 归零来修复它,但没有成功。

请注意,我在MyFragment 中加载MyNestedFragment

MyFragment.java

public class MyFragment extends Fragment {
    private View view;
    private FragmentManager fragmentManager;
    private Map<String, Fragment> fragments = new HashMap<String, Fragment>();
    private Fragment fragment;
    private ConstraintLayout contentContainer;    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.myfragment_layout, container, false);

        fragmentManager = getFragmentManager();

        TabLayout tabLayout = (TabLayout) view.findViewById(R.id.myfragment_tablelayout);
        tabLayout.addOnTabSelectedListener(onTabSelectedListener);

        contentContainer = view.findViewById(R.id.myfragment_contentcontainer);

        if (getContext() != null) {
            showFragment(MyNestedFragment.class);
        }

        return view;
    }

    public void showFragment(Class fragmentClass) {
        try {
            if (fragments.containsKey(fragmentClass.toString())) {
                fragment = fragments.get(fragmentClass.toString());
            } else {
                fragment = (Fragment) Class.forName(fragmentClass.getName()).newInstance();
            }

            fragmentManager.beginTransaction().replace(R.id.myfragment_contentcontainer, fragment).commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        view                = null;
        fragmentManager     = null;
        fragments           = null;
        contentContainer    = null;
    }        
}

知道如何修复内存泄漏吗?

提前致谢!

编辑 1
ConstraintLayout 依赖:
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

【问题讨论】:

  • 尝试将依赖更新到1.1.3,可能会有帮助
  • @warlock 你指的是哪个依赖?
  • 约束布局:实现'com.android.support.constraint:constraint-layout:1.1.3'
  • 如果要显示嵌套片段,请使用 childFragmentManager 而不是 fragmentManager
  • @warlock 谢谢你的澄清。我已经在使用1.1.3,但childFragmentManager 对我来说是新的。

标签: java android android-fragments memory-leaks leakcanary


【解决方案1】:

如果要显示嵌套片段,请使用childFragmentManager 而不是fragmentManager

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多