【问题标题】:Memory leak on fragment transaction片段事务的内存泄漏
【发布时间】:2017-03-15 05:22:22
【问题描述】:

我有两个片段一个列表和一个细节片段。在列表项上单击我隐藏列表片段并在后按详细片段上添加详细片段自动弹出我只是调用 super.onBackPressed() 但问题是它创建了如此多的详细片段引用导致内存泄漏

以下是我的代码

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.hide(this);
    ft.add(containerId, detailFragment, "detail");
    ft.addToBackStack("detail");
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();

当用户按下详细信息片段上的后退按钮时,我不想查看重新创建的视图,这就是我使用上述方法的原因。当我按下后退按钮 recylerview 滚动位置和其他数据时,我也不必保存当前实现

我的活动只有以下代码,它会膨胀列表片段

 if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.FragmentContainer1, ListFragment.newInstance(), TAG).commit();

    }

【问题讨论】:

  • 请发布完整的活动代码。
  • it is creating so many references of detail fragments resulting is memory leaks 你对此有多确定?您是从哪里看到这些泄漏的?
  • 添加了活动代码和内存分配。查看 DealFragment 的计数
  • 你只是在添加片段... add add add add... 试试replace ;)
  • 正确的方法应该是什么。

标签: android android-fragments memory-leaks fragment android-support-library


【解决方案1】:

我认为你做错的是你通过调用add 方法一次又一次地向容器添加片段:

在您的情况下,您应该使用replace 方法并将您的列表片段添加到后台堆栈。以下是你应该如何开始你的细节片段:

  FragmentManager fm  = getFragmentManager();

  fm.beginTransaction()
  .replace(R.id.container, new DetailFragment())
  .addToBackstack(null)
  .commit();

要返回到您的列表片段,它位于后堆栈中,只需调用:

fm.popBackStack();

编辑:

试试这个来显示你的列表片段:

protected void displayListFragment() {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    if (listFragment.isAdded()) { 
        ft.show(listFragment);
    } else { 
        ft.add(R.id.flContainer, listFragment, "ListFragment");
    }

    if (detailFragment.isAdded()) { 
        ft.remove(detailFragment);
    }

    ft.commit();
}

这是显示您的详细信息片段:

 protected void displayDetailFragment() {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        if (listFragment.isAdded()) { 
            ft.hide(listFragment);
        } 

        if (!detailFragment.isAdded()) { 
            ft.add(R.id.flContainer, detailFragment, "DetailFragment");
        }

        ft.commit();
    }

【讨论】:

  • 这样做不会恢复回收站视图滚动位置和其他内容
  • 您说您不需要保存滚动位置“以及当前实现时,当我按下返回按钮时,recylerview 滚动位置和其他我不必保存的数据”
  • 我说如果我添加替换滚动状态丢失,则使用curent实现
猜你喜欢
  • 2013-11-30
  • 2015-07-20
  • 2018-03-24
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多