【发布时间】:2018-02-07 16:55:15
【问题描述】:
目前,在 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执行
我不打算使用Service。正如您在 https://developer.android.com/guide/components/services.html 中看到的 2 个 Hello... 示例,具有自己的线程机制的 extends Service 比 extends IntentService 复杂得多
不过,我也注意到来自 Google https://developer.android.com/guide/components/bound-services.html 的一些警告
注意:如果您的应用面向 Android 5.0(API 级别 21)或更高版本,则 建议你使用 JobScheduler 来执行后台 服务。
我的目标是 API 25。所以,我应该认真对待这个建议。
我的问题是
- 在
onPause()期间我应该使用JobScheduler还是IntentService?我估计save()的执行时间应该不会超过 10 秒。 - 我会面临数据不一致的问题吗?我该如何解决?考虑以下情况
-
onPause触发。启动线程执行save -
onResume触发。加载器启动,执行load - 由于之前来自
onPause的线程仍未完成save操作,来自onResume的load可能会读取旧数据。
-
【问题讨论】:
标签: android multithreading intentservice android-intentservice android-jobscheduler