IntentService或JobScheduler在onPause

时间:2018-02-07 16:55:15

标签: android multithreading intentservice android-intentservice android-jobscheduler

目前,在活动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 Serviceextends IntentService

复杂得多

但是,我也注意到Google https://developer.android.com/guide/components/bound-services.html

的一些警告
  

注意:如果您的应用针对Android 5.0(API级别21)或更高版本,那么就是   建议您使用JobScheduler执行后台   服务。

我的目标是API 25.所以,我应该认真对待这个建议。

我的问题是

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

1 个答案:

答案 0 :(得分:1)

经过多次实验,这是我对

的观察

的jobscheduler

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

    1. 立即运行。
    2. 这项工作可以运行很长一段时间。让工作运行10分钟,我做了一个极端的案例。没问题,除非您明确地杀死应用程序。 (使用最近的任务列表关闭应用程序)
    3. 即使Google建议我们使用JobScheduler

        

      注意:如果您的应用针对Android 5.0(API级别21)或更高版本,那么就是   建议您使用JobScheduler执行后台   服务。

      对于我的情况,我需要

      1. 我的任务最多会执行2分钟。
      2. 我需要在应用退出后立即运行任务。我不希望它被推迟。
      3. 这就是我选择使用IntentService的原因。