WorkManager offre un supporto di alto livello per l'impostazione e l'osservazione della
progressi per i lavoratori. Se il worker era in esecuzione mentre l'app era nell'
in primo piano, queste informazioni possono essere mostrate all'utente anche utilizzando le API,
restituisce LiveData
di
WorkInfo
.
ListenableWorker
ora supporta
setProgressAsync()
che le consente di mantenere i progressi intermedi. Queste API consentono
agli sviluppatori di impostare i progressi intermedi osservabili dall'interfaccia utente.
L'avanzamento è rappresentato dal tipo Data
,
un container serializzabile di proprietà (simile a input
e
output
,
e soggetti alle stesse restrizioni).
Le informazioni sull'avanzamento possono essere osservate e aggiornate solo mentre
ListenableWorker
è in esecuzione. Tenta di impostare i progressi su un ListenableWorker
al termine dell'esecuzione vengono ignorati. Puoi anche osservare i progressi
di informazioni utilizzando l'elemento getWorkInfoBy…()
o
getWorkInfoBy…LiveData()
di machine learning. Questi metodi restituiscono istanze di
WorkInfo
, che ha una nuova
Metodo getProgress()
che restituisce Data
.
Avanzamento dell'aggiornamento
Per gli sviluppatori Java che utilizzano una ListenableWorker
o Worker
,
setProgressAsync()
L'API restituisce un ListenableFuture<Void>
; l'avanzamento dell'aggiornamento è asincrono,
dato che il processo di aggiornamento
prevede l'archiviazione delle informazioni sull'avanzamento in un database.
In Kotlin, puoi utilizzare la CoroutineWorker
setProgress()
dell'oggetto
funzione di estensione per aggiornare le informazioni sull'avanzamento.
Questo esempio mostra un semplice ProgressWorker
. L'Worker
imposta l'avanzamento su
0 all'inizio e al termine aggiorna il valore dell'avanzamento impostandolo su 100.
Kotlin
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() } }
Java
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(); } }
Osservazione dei progressi
Anche osservare le informazioni sui progressi è semplice. Puoi utilizzare lo
getWorkInfoBy…()
oppure getWorkInfoBy…LiveData()
e ottenere un riferimento a WorkInfo
.
Ecco un esempio che utilizza l'API getWorkInfoByIdLiveData
.
Kotlin
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 } })
Java
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 } } });
Per ulteriore documentazione sull'osservazione di Worker
oggetti, leggi
Stati lavorativi e osservazione del lavoro.