В настоящее время во время действия 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. Так что я должен серьезно отнестись к этому совету.
Мои вопросы
- Должен ли я использовать
JobScheduler
илиIntentService
во времяonPause()
? Я оцениваю время выполнения дляsave()
, не более 10 секунд. - Will I face data inconsistency problem and how can I overcome it? Consider the following case
onPause
triggered. A thread is launched to performsave
onResume
сработал. Запускается загрузчик, для выполненияload
- Поскольку предыдущий поток из
onPause
все еще не завершает операциюsave
,load
изonResume
может считать старые данные.