目前,在 Activity onPause()
期间,我正在执行 I/O 操作,以将应用程序数据持久保存到磁盘中。
private void save() {
saveDataToFiles();
}
public void onPause() {
super.onPause();
save()
}
随着时间的推移,应用需求变得越来越复杂。不仅我需要将数据保存到文件中。我还需要执行几项额外的任务。
- 将数据保存到SQLite
- 通过网络保存数据
因此,代码将演变成
private void save() {
saveDataToFiles();
saveDataToSQLite();
saveDataOverTheInternet();
}
public void onPause() {
super.onPause();
save()
}
现在,save()
方法是一个非常耗时的方法。在 UI 线程中执行耗时操作不是一个好主意。
我经历了How to execute background task when Android app is closed / set to background? (日期为 2016 年。因此,某些建议可能不再有效。)
我最初的计划是移动 save()
方法由 IntentService
执行
我不打算使用服务
。您可以在 https://developer.android.com/guide/components/services.html 中看到 2 个 Hello... 示例, extends Service
自己的线程机制比extends IntentService
但是,我也注意到来自 Google 的一些警告 https://developer.android.com/guide/components/bound-services.html
Note: If your app targets Android 5.0 (API level 21) or later, it's recommended that you use the JobScheduler to execute background services.
我的目标是 API 25。所以,我应该认真对待这个建议。
我的问题是
- 我应该在
onPause()
期间使用JobScheduler
还是IntentService
?我估计save()
的执行时间,应该不会超过 10 秒。 - 我会遇到数据不一致的问题吗?我该如何克服?考虑以下情况
onPause
触发。启动一个线程来执行save
onResume
触发。 Loader 启动,执行load
- 因为
onPause
中的前一个线程仍未完成save
操作,onResume
中的load
可能读取旧的数据。
最佳答案
经过多次实验,这是我对
的观察作业调度器
- 我们应该使用
android.support.v4.app.JobIntentService
而不是使用JobScheduler
。在底层,它将在 Android O 中使用JobScheduler
,在 Android O 之前使用startService
。 - 取决于操作系统。作业不会在 Android O 中立即启动。它可能会在作业开始前延迟多达 5 分钟。这是
JobScheduler
的预期行为。它根据资源可用性决定何时运行作业。 - 这项工作可以运行很长时间。我做了一个极端的例子,让作业运行 10 分钟。没问题,除非您明确终止该应用程序。 (使用最近的任务列表关闭应用程序)
Intent 服务
- 它会立即运行。
- 这项工作可以运行很长时间。我做了一个极端的例子,让作业运行 10 分钟。没问题,除非您明确终止该应用程序。 (使用最近的任务列表关闭应用程序)
尽管 Google 建议我们使用 JobScheduler
Note: If your app targets Android 5.0 (API level 21) or later, it's recommended that you use the JobScheduler to execute background services.
对于我的情况,我需要
- 我的任务最多执行 2 分钟。
- 我需要在应用程序退出后立即运行任务。我不想延迟。
这就是我选择使用 IntentService
的原因。
关于android - IntentService 或 JobScheduler 在 onPause 期间执行 I/O 密集型数据保存操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48669229/