当前位置: 首页 > 知识库问答 >
问题:

如何解决机器人中的片段反堆栈OutOfMemory问题?

左丘成天
2023-03-14

在我的Android应用html" target="_blank">程序中,我有列表视图和列表项详细信息视图。

Listview和details视图是一个活动中的片段。最初,我将列表片段加载到活动中,如果用户单击列表项,它将用细节片段替换相同的视图,并将该片段添加到一个活动中的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的正常行为,它不会清除内存中添加的碎片,即使这些碎片是从堆栈中弹出的。

由于业务需要,我不能为此安排两项活动。

我的方法难道不是用相同的活动将列表和细节片段化,并使用backstack返回导航的最佳方式吗?

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

共有1个答案

虞承泽
2023-03-14

然而,当一个片段被放入后台堆栈时,它的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();
    }
  }
 }

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

 类似资料:
  • 问题内容: 嗨,我正在尝试使用另一个空堆栈反转堆栈(我自己编写了一个堆栈)。由于某种原因,它无法正常工作。谁能帮我这个 ? 问题答案: while(!stack1.isEmpty()){ Integer value = (Integer)stack1.pop(); System.out.println(value); reverse.push(value); }

  • Back Stack是否支持与Android中的嵌套片段交互? 如果是这样,我做错了什么?在我的实现中,后退按钮完全忽略了我将此事务添加到后堆栈的事实。我希望这不是因为嵌套片段的问题,只是我做了一些不正确的事情。 以下代码位于我的一个片段中,用于将新片段与当前显示的任何嵌套片段交换:

  • 对于我工作的应用程序,我需要实现可访问性。除了一个屏幕外,其他一切都很好,我必须将片段添加到我的活动中。基本上,上面的片段是一个拨号键盘,用于输入密码。此片段与fragmentTransaction一起添加。 问题是对讲的焦点是设置在下面片段的元素上。 您知道是否有办法将对讲焦点设置在拨号片段上吗?我只想“禁用”下面的片段以获得焦点 谢谢,

  • 我想按相反的顺序打印stackx,怎么做?谢谢你..

  • 我需要一些帮助。em以这种方式向活动添加片段。问题是每次调用openFragment时,它都会创建片段并添加。这是显而易见的。问:我做了什么修改,所以它只能添加一次片段。在下一次使用相同的片段标记调用时,它不会执行任何操作。 案例:第一次按下按钮添加片段并显示。我再按一次同样的按钮,它没有反应。