【问题标题】:Is it ok to run long code inside onPause() in Android Activity?可以在 Android Activity 的 onPause() 中运行长代码吗?
【发布时间】:2020-09-26 02:47:34
【问题描述】:
“长代码”是指更新 SQLite 数据库的许多行。我已经实现了这一点。但是一些用户(只有少数)抱怨他们的数据没有更新。显然,只有当用户按下后退按钮时才会出现问题。也许 Activity 在完成 onPause() 中的代码之前就死了?这是正常现象吗?
提前致谢。
【问题讨论】:
标签:
android
android-sqlite
onpause
【解决方案1】:
直接来自the documentation about the Activity lifecycle:
onPause() 执行非常短暂,不一定有足够的时间来执行保存操作。因此,您不应该使用 onPause() 来保存应用程序或用户数据、进行网络调用或执行数据库事务;在该方法完成之前,此类工作可能无法完成。相反,您应该在 onStop() 期间执行重负载关闭操作。有关在 onStop() 期间执行的合适操作的更多信息,请参阅 onStop()。有关保存数据的更多信息,请参阅保存和恢复活动状态。
基本上:是的,你不应该在onPause 中做任何事情。
【解决方案2】:
不,您不应该在onPause() 中调用繁重的任务(SQL 事务)。
但是,您可以做的是在数据更改后立即保存数据。
我建议您将RoomDB 与Kotlin Coroutines 一起使用,这甚至不会阻塞您的用户界面。
【解决方案3】:
你的问题还不清楚。你应该发布你的代码,每个人都可以帮助你。
我建议使用ViewModel 或WorkManager 来执行任何需要完成的任务。不要将您的任务放在您的活动/视图上下文中。因为,活动/视图可能会在您难以控制的任何时候被破坏。