android - IntentService 或 JobScheduler 在 onPause 期间执行 I/O 密集型数据保存操作

标签 android multithreading intentservice android-intentservice android-jobscheduler

目前,在 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。所以,我应该认真对待这个建议。

我的问题是

  1. 我应该在 onPause() 期间使用 JobScheduler 还是 IntentService?我估计 save() 的执行时间,应该不会超过 10 秒。
  2. 我会遇到数据不一致的问题吗?我该如何克服?考虑以下情况
    • onPause 触发。启动一个线程来执行save
    • onResume 触发。 Loader 启动,执行load
    • 因为 onPause 中的前一个线程仍未完成 save 操作,onResume 中的 load 可能读取旧的数据。

最佳答案

经过多次实验,这是我对

的观察

作业调度器

  1. 我们应该使用 android.support.v4.app.JobIntentService 而不是使用 JobScheduler。在底层,它将在 Android O 中使用 JobScheduler,在 Android O 之前使用 startService
  2. 取决于操作系统。作业不会在 Android O 中立即启动。它可能会在作业开始前延迟多达 5 分钟。这是 JobScheduler 的预期行为。它根据资源可用性决定何时运行作业。
  3. 这项工作可以运行很长时间。我做了一个极端的例子,让作业运行 10 分钟。没问题,除非您明确终止该应用程序。 (使用最近的任务列表关闭应用程序)

Intent 服务

  1. 它会立即运行。
  2. 这项工作可以运行很长时间。我做了一个极端的例子,让作业运行 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.

对于我的情况,我需要

  1. 我的任务最多执行 2 分钟。
  2. 我需要在应用程序退出后立即运行任务。我不想延迟。

这就是我选择使用 IntentService 的原因。

关于android - IntentService 或 JobScheduler 在 onPause 期间执行 I/O 密集型数据保存操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48669229/

相关文章:

android - Intent 服务 : How to enqueue correctly?

java - android studio Intentservice未在应用程序之外运行

android - BroadcastReCeiver 内部实现

android - 以编程方式设置 PinEntryEditText 限制

android - ImageView setColorFilter alpha 丢失

java - 多种形式的 ID 生成

c++ - 如何中断等待的 C++0x 线程?

javascript - IONIC是否支持多线程并调用Java开发的jar lib

Android Admob 广告服务更新

java - Android Google Map v2 - 在 map 上显示当前位置以及自定义标记的推荐方法是什么?