我正在处理我的第一个Android应用程序。它有一个随着用户更新而持久保存到数据库的模型。onSaveInstanceState/onPause - 等到状态完全保存后才允许进程被终止
当调用onSaveInsanceState
时,我想保存一个可用于从数据库加载用户正在处理的文档的标识。但是这只能在文档完全打开数据库时才会发生。在某些情况下,持续复杂的文档可能需要几秒钟的时间(我希望一旦我完成所有的详细注销,速度会加快,并且在实际使用中,复杂的文档将由用户分阶段构建,其中每一个将被保存到数据库中,因此复杂文档不一定要全部保存)。
现在,线程在Android上的#1规则是“不要屏蔽UI线程”,所以当然数据库交互发生在一个单独的线程上。但是我对Android生命周期的理解是,在很多情况下onSaveInstanceState被调用,因为Android系统想要终止进程。这表明我不能让这个方法返回,直到数据库线程完成保存文档为止(事实上,使用我目前的设计,实际上我并不知道文档的ID号是什么,直到它被保存到数据库中,所以我甚至不能把它放在保存好的状态中)。
在这些情况下阻止UI线程等待持久任务是否合适?当调用onSaveInstanceState
是因为进程被终止时,该应用程序在前台不再可见,所以没有界面变得无法响应。
但是,当Activity实例被配置更新抛弃时,也会调用onSaveInstanceState
,这会在屏幕方向更改时发生。这是非常不幸的,当侧向旋转屏幕无法做任何事情几秒钟。在这种情况下,进程(因此内存空间)仍然存在,所以如果我可以只在Bundle中存储引用而不是其ID,那么我并不严格需要确保文档到达数据库。但我不知道有什么方法可以说明这两种情况之间的区别。
对于这些情况是否有一个公认的做法?我应该阻止线程安全吗?我可以使用普通的Java线程原语来阻止和等待吗?有什么我可以做的不阻止线程,但确保坚持任务将完成之前Android关闭的过程?
所有这些也适用于,因为onSaveInstanceState
不一定会被调用。
我认为'AsyncTask'的重点是它*不会阻塞UI线程?难道不是使用它来做长期作业的重点吗? – Ben
如果您在配置更改时遇到问题,请不要担心,只需在此活动标记中的mainfest文件中记下configChanges,以便在方向更改时从不调用onSaveInstanceState()。它不会强制重新启动 –
这很方便(但有其自身的问题),但与问题完全无关,这是如何确保在应用程序被终止时实际保存的持久数据(如果保存是由背景完成的)线。 – Ben