#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()