…Если процесс настройки виджета может занять несколько секунд (возможно, во время работы в Интернете запросы) и вам необходимо, чтобы ваш процесс продолжался, рассмотрите возможность запуска задачи с помощью WorkManager в методе onUpdate().
Но путем постановки рабочих запросов в очередь изнутри onUpdate, я получаю бесконечные вызовы onUpdate примерно каждые полсекунды с одним и тем же намерением. Я пробовал обновить виджет с помощью goAsync() и GlobalScope.launch для моего сетевого запроса, и он работает нормально. Однако рекомендуется выполнять работу ввода-вывода с помощью API WorkManager, и это то, что я пытаюсь сделать.
Я создал виджет приложения с помощью Новый -> Шаблон меню Виджет -> Виджет приложения, и я пытаюсь поставить работу в очередь следующим образом:
Код: Выделить всё
class NewAppWidget : AppWidgetProvider() {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager,appWidgetIds: IntArray) {
val inputData = Data.Builder().putIntArray("ids", appWidgetIds).build()
val workRequest = OneTimeWorkRequestBuilder().setInputData(inputData).build()
WorkManager.getInstance(context.applicationContext).enqueue(workRequest)
}
}
Код: Выделить всё
class WidgetUpdateWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
override suspend fun doWork(): Result {
val appWidgetIds = inputData.getIntArray("ids")
val appWidgetManager = AppWidgetManager.getInstance(applicationContext)
delay(200L) // Simulate network call. The behavior is the same with Retrofit and a real network call
appWidgetIds?.forEach { id ->
val views = RemoteViews(applicationContext.packageName, R.layout.new_app_widget)
views.setTextViewText(R.id.appwidget_text, "Setting text from worker")
appWidgetManager.updateAppWidget(id, views)
}
return Result.success()
}
}
Код: Выделить всё
Что я делаю не так? Я ориентируюсь на API 30 и использую версию WorkManager androidx.work:work-runtime-ktx:2.6.0
Подробнее здесь: https://stackoverflow.com/questions/706 ... update-cal