什么时候更新UI是安全的?

时间:2014-06-12 17:25:15

标签: android

我觉得这应该由Activity课程中的文档回答,但我仍然不肯定 - 何时更新活动的UI(或片段)实际上是安全的)?只有当活动恢复时,或者开始和停止之间的任何点?

例如,Activity文档状态:

  

活动的可见生命周期发生在对onStart()的调用之间,直到对onStop()的相应调用。在此期间,用户可以在屏幕上看到活动,尽管它可能不在前台并与用户交互。在这两种方法之间,您可以维护向用户显示活动所需的资源。例如,您可以在onStart()中注册BroadcastReceiver以监视影响UI的更改,并在用户不再看到您正在显示的内容时在onStop()中取消注册。 onStart()和onStop()方法可以多次调用,因为活动对用户来说是可见的和隐藏的。

从那个阅读中,我会假设即使显示前景对话框,我也可以安全地更新它背后的UI元素。

修改 澄清一下:我问的原因是在触发AsyncTask并尝试更新onPostExecute方法中的UI时被错误所困。即使它在UI线程上运行,用户已经远离该视图导航,我将收到异常。我现在正在开始一个新项目,并尝试围绕更好的AsyncTask成语制定一些指导原则。

1 个答案:

答案 0 :(得分:5)

我想这可归结为你的意思" safe"更新UI。对于“活动”屏幕上的元素,即使您的“活动”不在前台,也可以随时更新它们(但请确保从UI线程更新)。

然而,惹恼你的问题是保存状态:onSaveInstanceState

如您所知,操作系统可能会破坏后台活动以释放内存。当你回到它时,它将被重新创建。在此过程中,将调用onSaveInstanceState方法。如果操作系统确实销毁了活动,在调用onSaveInstanceState之后对UI状态所做的任何更改将不会保留

对于Fragments,如果您尝试在FragmentTransaction之后提交onSaveInstanceState,则实际上会收到IllegalStateException。 More info on that.

总而言之,您可以随时更新活动的UI并尝试优雅地处理碎片问题,但可能在活动恢复时丢失这些更新。

所以,你可以说,只有在调用onSaveInstanceState之前更新活动才真正安全。

关于异步任务onPostExectue的编辑

这可能与我上面提到的碎片状态损失问题有关。从我链接到的博客文章:

  

避免在异步回调方法中执行事务。这包括常用的方法,如AsyncTask#onPostExecute()和LoaderManager.LoaderCallbacks#onLoadFinished()。在这些方法中执行事务的问题是,在调用它们时,它们不知道Activity生命周期的当前状态。例如,请考虑以下事件序列:

     
      
  1. 活动执行AsyncTask。

  2.   
  3. 用户按下" Home" key,导致活动的onSaveInstanceState()和onStop()方法被调用。

  4.   
  5. AsyncTask完成并调用onPostExecute(),但不知道该Activity已被停止。

  6.   
  7. FragmentTransaction在onPostExecute()方法中提交,导致抛出异常。

  8.