如何修复android中的片段backstack OutOfMemory问题?

时间:2016-02-03 08:48:06

标签: android android-fragments out-of-memory fragment-backstack

在我的Android应用程序中,我有列表视图和列表项详细信息视图。

Listview和详细信息视图是一个活动中的片段。 最初我将列表片段加载到活动中,如果用户点击列表项,它将使用详细信息片段替换相同的视图,并将该片段添加到一个活动中的 backstack

代码:

    String backStateName =  fragment.getClass().getName();
    String fragmentTag = backStateName;
    FragmentManager manager = activity.getSupportFragmentManager();
    boolean fragmentPopped = manager.popBackStackImmediate (backStateName, 0);
    if ( !fragmentPopped && manager.findFragmentByTag(fragmentTag) == null){ 
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.main_place_holder, fragment, fragmentTag);
        ft.addToBackStack(backStateName);
        ft.commit();
    }

如果用户点击后退按钮,它将进入列表视图,这样就可以了。

所以我的问题是,如果用户点击列表项应用程序崩溃多次(超过10次) OutOfMemory

我搜索并且有人说这是后台堆栈的正常行为,它不会清除内存中添加的碎片,即使这些碎片是从堆栈中加载的。

由于业务需求,我不能为此开展两项活动。

是不是我的方法列出了具有相同活动的列表和细节片段,并使用backstack以最佳方式回传导航?

如果不是我应该遵循的最佳选择?

1 个答案:

答案 0 :(得分:-1)

  然而,当片段放在后面的堆栈上时,它就是   onDestroyView()被调用。如果在那时你清理任何专业   片段保存的分配,你不应该有记忆   的问题。

参考此问题When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?

编辑: 覆盖片段上的setUserVisibleHint。这为您提供了一个很好的位置,可以确定在片段进入和退出视图时(例如,当您有从FragmentA切换到FragmentB的PagerAdapter时)在何处进行资源设置或清理资源。

    public class MyFragment extends Fragment {
  @Override
  public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
      //you are visible to user now - so set whatever you need 
      initResources();
    }

    else { 
     //you are no longer visible to the user so cleanup whatever you need
     cleanupResources();
    }
  }
 }

您正在堆叠物品放在靠背堆上,因此预计至少会有一点内存占用,但是当碎片不在视图范围内时,您可以通过清理资源来最小化占用空间。以上技术。这可能是帮助