WorkManager - запуск периодической задачи

Я хочу запускать периодическую задачу каждые 3 часа с помощью нового WorkManager. Рабочий, инициированный при создании приложения. Для этого я использую следующий код:

public class ApplicationCommon extends MultiDexApplication {

@Override
public void onCreate() {
    super.onCreate();


    ... some init code
    // some code that I don't want to run again for every periodic worker...
    ... some analytics 
}

Внутри MainActivity

@Override
public void onCreate() {
    super.onCreate();
    runCouponValidatorWorker()
}

fun runCouponValidatorWorker() {
    val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()
    val worker = PeriodicWorkRequestBuilder<CouponValidatorWorker>(3, TimeUnit.HOURS).setConstraints(constraints).build()
    WorkManager.getInstance()?.enqueueUniquePeriodicWork("couponValidatorWorker", ExistingPeriodicWorkPolicy.REPLACE, worker)
}

Однако похоже, что рабочий, когда запускается периодически, каждый раз создает новый экземпляр класса Application и, следовательно, приводит к повторному запуску большого количества кода инициализации, как если бы приложение снова запускалось пользователем (что вызывает false -положительная аналитика, вызовы API и т. д.). Есть ли способ избежать этого / иметь флаг, указывающий, что приложение было инициировано работником?


person Rom Shiri    schedule 22.07.2018    source источник
comment
Какую версию WorkManager вы используете? А почему вы написали код WorkManager в классе Application вместо Activity?   -  person Viraj Patel    schedule 23.07.2018
comment
1.0.0-alpha04. И вы правы (обновленный вопрос), это должно быть в классе активности. В любом случае, есть ли способ узнать, было ли приложение снова запущено из-за рабочего?   -  person Rom Shiri    schedule 25.07.2018
comment
Где-то в документации написано, что его следует инициализировать в Activity? Я не могу найти ничего, кроме этой кодовой лаборатории, где она есть инициализируется в ViewModel.   -  person Vít Kapitola    schedule 27.08.2020


Ответы (1)


Обратитесь к этой PeriodicWorkRequest демонстрации GitHub и обновите TimeUnit в соответствии с вашими требованиями (т. Е. За 3 часа) в DayIncrementViewModel. Джава. Он будет работать в соответствии с вашими потребностями.

Чтобы проверить, инициирована ли ваша работа или нет, вы можете сохранить UUID в сеансе при планировании рабочего запроса. Если UUID пустой или пустой, ваш WorkRequest не инициируется.
Вы также можете проверить рабочий статус, используя этот UUID. Дополнительные сведения см. По этой ссылке.

Демонстрация написана на Java, но вы можете преобразовать свой код на Kotlin.

К вашему сведению: WorkManager 1.0.0-alpha05 уже выпущен, поэтому вам следует обновить версию WorkManager, поскольку в ней исправлены некоторые проблемы, связанные с PeriodicWorkRequest.

person Viraj Patel    schedule 25.07.2018