观察 Worker 的中间进度
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
WorkManager 为设置和观察工作器的中间进度添加了内置支持。如果应用在前台运行时,工作器保持运行状态,那么也可以使用返回 WorkInfo
的 LiveData
的 API 向用户显示此信息。
ListenableWorker
现在支持 setProgressAsync()
API,此类 API 允许保留中间进度。借助这些 API,开发者能够设置可通过界面观察到的中间进度。进度由 Data
类型表示,这是一个可序列化的属性容器(类似于 input
和 output
,并且受到相同的限制)。
只有在 ListenableWorker
运行时才能观察到和更新进度信息。如果尝试在 ListenableWorker
完成执行后在其中设置进度,则将会被忽略。
您还可以使用 getWorkInfoBy…()
或 getWorkInfoBy…LiveData()
方法来观察进度信息。这两个方法会返回 WorkInfo
的实例,后者有一个返回 Data
的新 getProgress()
方法。
更新进度
对于使用 ListenableWorker
或 Worker
的 Java 开发者,setProgressAsync()
API 会返回 ListenableFuture<Void>
;更新进度是异步过程,因为更新过程涉及将进度信息存储在数据库中。在 Kotlin 中,您可以使用 CoroutineWorker
对象的 setProgress()
扩展函数来更新进度信息。
此示例展示了一个 ProgressWorker
。Worker
在启动时将进度设置为 0,在完成后将进度值更新为 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();
}
}
观察进度
如需观察进度信息,请使用 getWorkInfoById
方法,并获取对 WorkInfo
的引用。
以下示例分别使用 getWorkInfoByIdFlow
(适用于 Kotlin)和 getWorkInfoByIdLiveData
(适用于 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
}
}
});
如需详细了解如何观察 Worker
对象,请阅读工作状态和观察工作。
如需了解如何在工作意外终止时获取 stopReason,请参阅观察停止原因状态。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-08-22。
[null,null,["最后更新时间 (UTC):2025-08-22。"],[],[],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)."]]