onSaveInstanceState/onPause - 等待状态完全保存,然后才允许进程被终止

Ben*_*Ben 8 lifecycle multithreading android

我正在开发我的第一款Android应用.它有一个模型,在用户进行更新时持久保存到数据库.

onSaveInsanceState被调用时,我想保存,可以用来加载用户已经从数据库中处理文档的ID.但这只能在文档完全访问数据库后才会发生.在某些情况下,持久化复杂的文档可能需要几秒钟(我希望一旦我完成所有详细的注销,这将加速,并且在实际使用中,用户将分阶段构建复杂的文档,每个文档都是将被保存到数据库中,因此复杂文档不太可能一次性保存.

现在,Android上线程的#1规则是"不要阻止UI线程",所以当然数据库交互发生在一个单独的线程上.但我对Android生命周期的理解是,在许多情况下,调用onSaveInstanceState是因为Android系统想要终止进程.这表明我不能允许这个方法返回,直到数据库线程完成保存文档(实际上我的当前设计,我实际上不知道文档的ID号是什么,直到它被保存到数据库,所以我甚至不能把它放在保存状态的束中).

在这些情况下是否适合阻止等待执行持久性任务的UI线程?当onSaveInstanceState因为进程被杀死而被调用时,应用程序在前台不再可见,因此没有任何界面无法响应.

但是onSaveInstanceState当Activity实例被配置更新破坏时也会调用,当屏幕方向发生变化时会发生这种情况.横向旋转屏幕几秒钟后无法做任何事情是非常不幸的.在这种情况下,进程(以及因此内存空间)仍然存在,因此我不需要确保文档命中数据库,如果我只能在Bundle中存储对它的引用而不是它的id.但我不知道如何区分这两种情况.

这些情况是否有公认的做法?我应该阻止线程安全吗?我可以使用普通的Java线程原语来阻止和等待吗?有什么我可以做的不会阻止线程,但确保在Android关闭进程之前完成持久性任务?

所有这些也适用于onPause,onSaveInstanceState不一定会被称为.

may*_*oid 0

您应该尝试 AsyncTask,它将阻止您的 ui 但不会显示空白屏幕,将加载必要的 xml 元素,然后从异步任务中获取调用,在异步任务中将您的文档保存在数据库中。

请点击此链接:AyncTask Exmaple