Observer la progression des workers intermédiaires
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
WorkManager est compatible avec la définition et l'observation de la progression intermédiaire des nœuds de calcul. Si le nœud de calcul était en cours d'exécution lorsque l'application était au premier plan, ces informations peuvent également être présentées à l'utilisateur via l'API qui renvoient les LiveData
de WorkInfo
.
ListenableWorker
est désormais compatible avec l'API setProgressAsync()
, ce qui lui permet de conserver une progression intermédiaire. Ces API permettent aux développeurs de définir une progression intermédiaire accessible par l'interface utilisateur.
La progression est représentée par le type Data
, qui est un conteneur de propriétés sérialisable (semblable à input
et output
, et soumis aux mêmes restrictions).
Les informations de progression ne sont accessibles et mises à jour que lorsque ListenableWorker
est en cours d'exécution. Les tentatives de définition de la progression sur un ListenableWorker
une fois que son exécution est terminée sont ignorées.
Les informations de progression sont accessibles via la méthode getWorkInfoBy…()
ou getWorkInfoBy…LiveData()
. Ces méthodes renvoient des instances de WorkInfo
, qui possède une nouvelle méthode getProgress()
qui renvoie Data
.
Progression de la mise à jour
Pour les développeurs Java utilisant un ListenableWorker
ou un Worker
, l'API setProgressAsync()
renvoie un ListenableFuture<Void>
; la progression de la mise à jour est asynchrone, car le processus de mise à jour implique le stockage des informations de progression dans une base de données.
En langage Kotlin, vous pouvez utiliser la fonction d'extension setProgress()
de l'objet CoroutineWorker
pour mettre à jour les informations de progression.
Cet exemple présente un ProgressWorker
. Le Worker
définit sa progression sur 0 lorsqu'il commence et, une fois qu'il a terminé, il définit la valeur de progression sur 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();
}
}
Observer la progression
Pour observer les informations de progression, utilisez les méthodes getWorkInfoById
et obtenez une référence à WorkInfo
.
Voici un exemple qui utilise getWorkInfoByIdFlow
pour Kotlin et getWorkInfoByIdLiveData
pour Java.
Kotlin
WorkManager.getInstance(applicationContext)
// requestId is the WorkRequest id
.getWorkInfoByIdFlow(requestId)
.collect { 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
}
}
});
Pour en savoir plus sur l'observation d'objets Worker
, consultez États et observation du calcul.
Pour savoir comment obtenir le stopReason lorsqu'un travail se termine de manière inattendue, consultez Observer l'état de la raison de l'arrêt.
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/22 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/22 (UTC)."],[],[],null,["# Observe intermediate worker progress\n\nWorkManager has built-in support for setting and observing intermediate\nprogress for workers. If the worker was running while the app was in the\nforeground, this information can also be shown to the user using APIs which\nreturn the [`LiveData`](/reference/androidx/lifecycle/LiveData) of\n[`WorkInfo`](/reference/androidx/work/WorkInfo).\n\n[`ListenableWorker`](/reference/androidx/work/ListenableWorker) now supports the\n[`setProgressAsync()`](/reference/androidx/work/ListenableWorker#setProgressAsync(androidx.work.Data))\nAPI, which allows it to persist intermediate progress. These APIs allow\ndevelopers to set intermediate progress that can be observed by the UI.\nProgress is represented by the [`Data`](/reference/androidx/work/Data) type,\nwhich is a serializable container of properties (similar to [`input` and\n`output`](/topic/libraries/architecture/workmanager/advanced#params),\nand subject to the same restrictions).\n\nProgress information can only be observed and updated while the\n`ListenableWorker` is running. Attempts to set progress on a `ListenableWorker`\nafter it has completed its execution are ignored.\n\nYou can also observe progress\ninformation by using the one of the [`getWorkInfoBy...()` or\n`getWorkInfoBy...LiveData()`](/reference/androidx/work/WorkManager#getWorkInfoById(java.util.UUID))\nmethods. These methods return instances of\n[`WorkInfo`](/reference/androidx/work/WorkInfo), which has a new\n[`getProgress()`](/reference/androidx/work/WorkInfo#getProgress()) method\nthat returns `Data`.\n\nUpdate Progress\n---------------\n\nFor Java developers using a [`ListenableWorker`](/reference/androidx/work/ListenableWorker)\nor a [`Worker`](/reference/androidx/work/Worker), the\n[`setProgressAsync()`](/reference/androidx/work/ListenableWorker#setProgressAsync(androidx.work.Data))\nAPI returns a `ListenableFuture\u003cVoid\u003e`; updating progress is asynchronous,\ngiven that the update process involves storing progress information in a database.\nIn Kotlin, you can use the [`CoroutineWorker`](/reference/kotlin/androidx/work/CoroutineWorker)\nobject's [`setProgress()`](/reference/kotlin/androidx/work/CoroutineWorker#setprogress)\nextension function to update progress information.\n\nThis example shows a `ProgressWorker`. The `Worker` sets its progress to\n0 when it starts, and upon completion updates the progress value to 100. \n\n### Kotlin\n\n import android.content.Context\n import androidx.work.CoroutineWorker\n import androidx.work.Data\n import androidx.work.WorkerParameters\n import kotlinx.coroutines.delay\n\n class ProgressWorker(context: Context, parameters: WorkerParameters) :\n CoroutineWorker(context, parameters) {\n\n companion object {\n const val Progress = \"Progress\"\n private const val delayDuration = 1L\n }\n\n override suspend fun doWork(): Result {\n val firstUpdate = workDataOf(Progress to 0)\n val lastUpdate = workDataOf(Progress to 100)\n setProgress(firstUpdate)\n delay(delayDuration)\n setProgress(lastUpdate)\n return Result.success()\n }\n }\n\n### Java\n\n import android.content.Context;\n import androidx.annotation.NonNull;\n import androidx.work.Data;\n import androidx.work.Worker;\n import androidx.work.WorkerParameters;\n\n public class ProgressWorker extends Worker {\n\n private static final String PROGRESS = \"PROGRESS\";\n private static final long DELAY = 1000L;\n\n public ProgressWorker(\n @NonNull Context context,\n @NonNull WorkerParameters parameters) {\n super(context, parameters);\n // Set initial progress to 0\n setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build());\n }\n\n @NonNull\n @Override\n public Result doWork() {\n try {\n // Doing work.\n Thread.sleep(DELAY);\n } catch (InterruptedException exception) {\n // ... handle exception\n }\n // Set progress to 100 after you are done doing your work.\n setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build());\n return Result.success();\n }\n }\n\nObserving Progress\n------------------\n\nTo observe progress information, use the [`getWorkInfoById`](/reference/androidx/work/WorkManager#getWorkInfoById(java.util.UUID)) methods, and get a reference to\n[`WorkInfo`](/reference/androidx/work/WorkInfo).\n\nHere is an example which uses `getWorkInfoByIdFlow` for Kotlin and\n`getWorkInfoByIdLiveData` for Java. \n\n### Kotlin\n\n WorkManager.getInstance(applicationContext)\n // requestId is the WorkRequest id\n .getWorkInfoByIdFlow(requestId)\n .collect { workInfo: WorkInfo? -\u003e\n if (workInfo != null) {\n val progress = workInfo.progress\n val value = progress.getInt(\"Progress\", 0)\n // Do something with progress information\n }\n }\n\n### Java\n\n WorkManager.getInstance(getApplicationContext())\n // requestId is the WorkRequest id\n .getWorkInfoByIdLiveData(requestId)\n .observe(lifecycleOwner, new Observer\u003cWorkInfo\u003e() {\n @Override\n public void onChanged(@Nullable WorkInfo workInfo) {\n if (workInfo != null) {\n Data progress = workInfo.getProgress();\n int value = progress.getInt(PROGRESS, 0)\n // Do something with progress\n }\n }\n });\n\nFor more documentation on observing `Worker` objects, read\n[Work States and observing work](/topic/libraries/architecture/workmanager/how-to/states-and-observation).\nTo learn how to get the [stopReason](/reference/androidx/work/WorkInfo#getStopReason())\nwhen work terminates unexpectedly, reference [Observe stop reason state](/develop/background-work/background-tasks/persistent/how-to/manage-work#stop-reason)."]]