Android WorkManager и рабочий

#java #android #kotlin #android-jetpack

Вопрос:

У меня есть следующий фрагмент кода ниже. Мне нужно иметь возможность запускать WorkerUtil.periodicSchedulerWorker каждые 15 минут. Что я заметил, так это то, что он запускается только один раз, а затем никогда не повторяется. И когда он запускается в первый раз, все прикованные Рабочие не запускаются. Есть какие-нибудь идеи относительно того, почему он не может работать каждые 15 минут? или что я могу сделать, чтобы улучшить текущий код. Из документации видно, что через 15 минут он может решить, что для запуска потребуется больше времени, что в моем случае нормально. Я хочу убедиться, что он гарантированно заработает за это время. Я дважды проверил все ограничения и критерии возврата, которые выглядят нормально.

Я знаю, что есть PeriodicWorkRequestBuilder, но мы не можем связать с ним повторяющуюся работу.

 fun WorkManager.addFamilyUpdate(): WorkContinuation =
    beginWith(WorkerUtil.refreshSomething)
        .then(WorkerUtil.retrieveSomething)
        .then(WorkerUtil.getSomethingElse)
        .then(WorkerUtil.profileImageDoaloader)
        .then(WorkerUtil.refreshWidgetUI)



 val periodicSchedulerWorker =  OneTimeWorkRequestBuilder<PeriodicFamilyWidgetsSchedulerWorker()
            .setInitialDelay(REFRESH_MIN, TimeUnit.MINUTES)
            .build()

fun WorkContinuation.addFollowUpUpdate(): WorkContinuation =
    then(WorkerUtil.periodicSchedulerWorker)

class PeriodicSchedulerWorker(val context: Context, params: WorkerParameters) :
    CoroutineWorker(context, params) {

    override suspend fun doWork(): Result {
        WorkManager.getInstance(context)
            .addFamilyUpdate()
            .addFollowUpUpdate()
            .enqueue()

        return Result.success()
    }
}
 

Комментарии:

1. Почему у вас есть тег Swift в коде Android Kotlin?

2. Создает ли какой-либо работник addFamilyUpdate исключение или сбой? Я попытался выполнить аналогичную настройку, как и вы, и не смог повторить ее только тогда, когда одна из задач была выполнена неудачно

3. Ни один из них не выходит из строя в моей настройке. Все они успешно работают с первого раза. @Туанхау

4. Можете ли вы обновить код, который запускает 1-й запуск?

Ответ №1:

 val periodicSchedulerWorker =  OneTimeWorkRequestBuilder<PeriodicFamilyWidgetsSchedulerWorker()
           .setInitialDelay(REFRESH_MIN, TimeUnit.MINUTES)
           .build()
 

Проблема заключалась в том, что ссылки для каждой из переменных val не были инициализированы. Для вышеупомянутого periodicSchedulerWorker я просто превратился в функцию, и это решило мою проблему. Изначально я следовал документации Android, не зная, что изменилось:

 fun periodicSchedulerWorker() =  OneTimeWorkRequestBuilder<PeriodicFamilyWidgetsSchedulerWorker()
           .setInitialDelay(REFRESH_MIN, TimeUnit.MINUTES)
           .build()