【问题标题】:How to avoid data reload on android device back button如何避免android设备后退按钮上的数据重新加载
【发布时间】:2011-10-22 23:46:23
【问题描述】:

我正在使用带有 TabGroupActivity 的基于 android 选项卡的应用程序,该应用程序有一个 ListActivity“A”,它向下钻取到一个详细活动“D”,当我单击设备返回按钮时,它导航回 ListActivtiy“A”和重新加载数据(ProgressBar 显示返回按钮的进度)。
如何避免在后退按钮上重新加载数据?
任何帮助将不胜感激。

【问题讨论】:

  • 在 onCreate 事件中,我正在调用一个 web 服务来加载数据,在单击后退按钮时再次调用它,我想避免在后退按钮上调用 web 服务。
  • 如果这是相同的数据 - 请参阅下面的答案,否则 - 我认为您没有太多选择,只能重新加载它

标签: android button android-activity reload back


【解决方案1】:

也许您可以使用onSaveInstanceState() 来保存需要保存的内容,然后在onCreate() 中恢复您的活动

【讨论】:

  • 我使用以下代码保存变量值 IsAlreadyLoaded。 @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putBoolean("IsAlreadyLoaded", true); super.onSaveInstanceState(savedInstanceState); } 并在返回活动时在 oncreate 事件中检索此值。但是我将 savedInstanceState 设为 null,我无法获得我保存的内容。在下面的代码中,savedInstanceState 始终为 null `boolean myBoolean = savedInstanceState.getBoolean("IsAlreadyLoaded");
  • 你在哪里实现onSaveInstanceState?您可以在保存/检索数据的位置发布所有代码吗?
  • onCreate 不会在您返回之前的活动时调用,除非内存不足,并且系统决定在活动上调用 onDestroy。
  • 对不起,我不太明白。当你按下返回时,当前的活动被销毁,之前的活动调用onStart/onResume。在这里,这似乎是 TabHostActivity。如果在列表活动中加载数据的唯一方法是在 onCreate 中,那么当调用 onStart 或 onResume 时,TabHostActivity 似乎会重新创建所有选项卡。但我读过你需要专门调用 tabhost.destroyActivity 和 startActivity 来“重新创建”活动。我的观点是,当你按下回击时,它不应该调用 ListActivity 的 onCreate,你应该看看为什么。
  • @Asahi,我覆盖了 onSaveInstanceState 并保存了一个值为 true 的变量,如下面的@Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putBoolean("IsAlreadyLoaded", true); super.onSaveInstanceState(savedInstanceState); } 然后尝试在 onCreate 中获取该值,就像下面的 boolean myBoolean = savedInstanceState.getBoolean("IsAlreadyLoaded"); 一样,但由于 saveInstanceState 无法获取变量值对象为空
【解决方案2】:

如果你看Activity LifeCycle

当你去另一个活动,并按下回,它会调用finish()。第一个活动在 onStop() 方法上,因为它不再可见。所以,当你回到第一个活动时,它会调用方法 onStart() 和 on Stop()。

尝试在不调用超级方法的情况下重载此方法(这可能是一个非常糟糕的主意)。

你也可以尝试记住你当时的位置(获取当前标签的索引),并在 onResume() 方法上,将当前标签设置为这个索引。

您只需要在您的列表活动中添加一个 int 属性 savedPosition。 private int savedPosition = -1;

@Override
protected void onPause() {
  savedPosition = getListView().getFirstVisiblePosition();

  super.onPause();
}



@Override
protected void onResume() {
  super.onResume();
  if(savedPosition != -1) {
    getList().setSelection(savedPosition);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2019-05-14
    • 2014-03-30
    • 2013-10-07
    相关资源
    最近更新 更多