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

Tom*_*m G 7 android

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

例如,Activity文档说明:

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

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

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

jac*_*ted 5

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

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

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

对于Fragments,如果尝试提交FragmentTransactionafter ,实际上会得到IllegalStateException onSaveInstanceState.更多信息.

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

因此,您可以说,只有在活动处于前台时,或者更确切地说,在调用之前更新活动才真正安全onSaveInstanceState.

编辑有关异步任务onPostExectue的问题

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

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

  1. 活动执行AsyncTask.

  2. 用户按下"Home"键,调用活动的onSaveInstanceState()和onStop()方法.

  3. AsyncTask完成并调用onPostExecute(),不知道Activity已经停止.

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