1

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

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

代码:

    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 的正常行为,即使从堆栈中弹出这些片段,它也不会从内存中清除添加的片段。

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

我的方法不是列表和详细信息片段具有相同的活动并通过使用 backstack 来交还导航是最好的方式吗?

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

4

1 回答 1

-1

然而,当一个片段被放到后台堆栈时,它的 onDestroyView() 会被调用。如果此时您清理了片段所持有的任何主要分配,那么您不应该有内存问题。

参考这个问题 当片段被替换并放入后堆栈(或删除)时,它是否保留在内存中?

编辑:覆盖片段上的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();
    }
  }
 }

您正在将项目堆叠在后堆栈上,因此预计至少会有一点内存占用,但是您可以通过使用上述技术在片段不在视野范围内时清理资源来最小化占用空间。这可能会有所帮助

于 2016-02-03T09:00:57.887 回答