Workmanager имеет первоклассную поддержку для установления и наблюдения за промежуточным прогрессом для работников. Если работник работал, пока приложение находилось на переднем плане, эта информация также может быть показана пользователю, использующему API, которые возвращают LiveData
of WorkInfo
.
ListenableWorker
теперь поддерживает API setProgressAsync()
, который позволяет ему сохранять промежуточный прогресс. Эти API позволяют разработчикам установить промежуточный прогресс, который может наблюдаться с помощью пользовательского интерфейса. Прогресс представлен типом Data
, который представляет собой сериализуемый контейнер с свойствами (аналогично input
и output
, и с учетом тех же ограничений).
Информация о прогрессе может быть замечена и обновлена только во время работы ListenableWorker
. Попытки установить прогресс на ListenableWorker
после того, как он завершит выполнение, игнорируются. Вы также можете соблюдать информацию о прогрессе, используя один из методов getWorkInfoBy…()
или getWorkInfoBy…LiveData()
. Эти методы возвращают экземпляры WorkInfo
, который имеет новый метод getProgress()
, который возвращает Data
.
Обновление прогресса
Для разработчиков Java, использующих ListenableWorker
или Worker
, API setProgressAsync()
возвращает ListenableFuture<Void>
; Обновление прогресса является асинхронным, учитывая, что процесс обновления включает в себя хранение информации о прогрессе в базе данных. В Kotlin вы можете использовать функцию расширения объекта CoroutineWorker
setProgress()
для обновления информации о прогрессе.
В этом примере показан простой ProgressWorker
. Worker
устанавливает свой прогресс на 0, когда он начинается, и после завершения обновляет значение прогресса до 100.
Котлин
import android.content.Context import androidx.work.CoroutineWorker import androidx.work.Data import androidx.work.WorkerParameters import kotlinx.coroutines.delay class ProgressWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { companion object { const val Progress = "Progress" private const val delayDuration = 1L } override suspend fun doWork(): Result { val firstUpdate = workDataOf(Progress to 0) val lastUpdate = workDataOf(Progress to 100) setProgress(firstUpdate) delay(delayDuration) setProgress(lastUpdate) return Result.success() } }
Ява
import android.content.Context; import androidx.annotation.NonNull; import androidx.work.Data; import androidx.work.Worker; import androidx.work.WorkerParameters; public class ProgressWorker extends Worker { private static final String PROGRESS = "PROGRESS"; private static final long DELAY = 1000L; public ProgressWorker( @NonNull Context context, @NonNull WorkerParameters parameters) { super(context, parameters); // Set initial progress to 0 setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build()); } @NonNull @Override public Result doWork() { try { // Doing work. Thread.sleep(DELAY); } catch (InterruptedException exception) { // ... handle exception } // Set progress to 100 after you are done doing your work. setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build()); return Result.success(); } }
Наблюдение за прогрессом
Наблюдать за информацией о прогрессе также является простым. Вы можете использовать методы getWorkInfoBy…()
или getWorkInfoBy…LiveData()
и получить ссылку на WorkInfo
.
Вот пример, который использует API getWorkInfoByIdLiveData
.
Котлин
WorkManager.getInstance(applicationContext) // requestId is the WorkRequest id .getWorkInfoByIdLiveData(requestId) .observe(observer, Observer { workInfo: WorkInfo? -> if (workInfo != null) { val progress = workInfo.progress val value = progress.getInt(Progress, 0) // Do something with progress information } })
Ява
WorkManager.getInstance(getApplicationContext()) // requestId is the WorkRequest id .getWorkInfoByIdLiveData(requestId) .observe(lifecycleOwner, new Observer<WorkInfo>() { @Override public void onChanged(@Nullable WorkInfo workInfo) { if (workInfo != null) { Data progress = workInfo.getProgress(); int value = progress.getInt(PROGRESS, 0) // Do something with progress } } });
Для получения дополнительной документации по вопросам наблюдения Worker
, прочитайте рабочие состояния и наблюдайте за работой .