IntentService или JobScheduler для выполнения операции сохранения данных с интенсивным вводом-выводом во время onPause

В настоящее время во время действия onPause() я выполняю операции ввода-вывода, чтобы сохранить данные приложения на диск.

private void save() {
    saveDataToFiles();
}

public void onPause() {
    super.onPause();
    save()
}

Со временем требования к приложениям усложняются. Не только мне нужно сохранять данные в файлы. Также мне нужно выполнить несколько дополнительных задач.

  • Сохранить данные в SQLite
  • Сохранение данных по сети

Следовательно, код будет развиваться в

private void save() {
    saveDataToFiles();
    saveDataToSQLite();
    saveDataOverTheInternet();
}

public void onPause() {
    super.onPause();
    save()
}

Метод save() требует довольно много времени. Не рекомендуется выполнять трудоемкую операцию в потоке пользовательского интерфейса.

Я прошел ​​Как выполнить фоновая задача, когда приложение Android закрыто / переведено в фоновый режим? (Оно датировано 2016 годом. Поэтому некоторые советы могут больше не действовать.)

Мой первоначальный план - метод move save(), который будет выполнен IntentService

Я не планирую использовать Service. Как вы можете видеть, 2 примера Hello... в https://developer.android.com/guide/components/services.html , extends Service с собственным механизмом многопоточности намного сложнее, чем extends 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. Will I face data inconsistency problem and how can I overcome it? Consider the following case
    • onPause triggered. A thread is launched to perform save
    • onResume сработал. Запускается загрузчик, для выполнения load
    • Поскольку предыдущий поток из onPause все еще не завершает операцию save, load из onResume может считать старые данные.

person Cheok Yan Cheng    schedule 07.02.2018    source источник


Ответы (1)


После нескольких экспериментов, вот мое наблюдение на

JobScheduler

  1. Вместо использования JobScheduler мы должны использовать android.support.v4.app.JobIntentService. По сути, он будет использовать JobScheduler в Android O и startService до Android O.
  2. В зависимости от ОС. Задание не запустится сразу в Android O. Оно может задержаться до 5 минут перед запуском задания. Это ожидаемое поведение JobScheduler. Он решает, когда запустить задание, в зависимости от доступности ресурсов.
  3. Работа может длиться довольно долго. Я сделал крайний случай, запустив задание на 10 минут. Нет проблем, если вы не убьете приложение явно. (Закройте приложение, используя список последних задач)

ИнтентСервис

  1. Он запускается немедленно.
  2. Работа может длиться довольно долго. Я сделал крайний случай, запустив задание на 10 минут. Нет проблем, если вы не убьете приложение явно. (Закройте приложение, используя список последних задач)

Несмотря на то, что Google советует нам использовать JobScheduler

Примечание. Если ваше приложение предназначено для Android 5.0 (уровень API 21) или более поздней версии, рекомендуется использовать JobScheduler для выполнения фоновых служб.

Для моего случая мне нужно

  1. Моя задача будет выполняться не более 2 минут.
  2. Мне нужно запустить задачу сразу после закрытия приложения. Я не хочу, чтобы это задерживалось.

Вот почему я решил использовать IntentService.

person Cheok Yan Cheng    schedule 11.02.2018