显示 运行 WorkManager 工作人员的详细进度
Showing detailed progress for running WorkManager workers
我想用新的 JetPack WorkManager (link to codelabs) 组件(在应用程序的沙箱分支中)替换现有数据同步系统的作业调度方面。我现有的系统运行良好,但 WorkManager
中的一些新功能会派上用场(例如链接)。
我当前的系统使用共享 LiveData
将正在进行的工作的进度传达给任何 UI 元素(在我的例子中是 RecyclerView
)观察它(我是实际上SwitchMapping中的ViewModel
变成了SyncItem
s)
的列表
data class SyncItem(
val title: String,
private var _progress: Int,
var total: Int) : BaseObservable() {
var progress: Int
@Bindable get() = _progress
set(value) {
_progress = value
notifyPropertyChanged(BR.progress)
}
}
新的 WorkManager
组件有几种方法(getStatusById
、getStatusesByTag
等)可用于通过一个或多个 WorkStatus
es 检索 LiveData ,但这些仅报告粗粒度状态(运行、成功、失败、已取消)。
向 UI 传达进度(例如“546/1234 项已下载”)的推荐方式是什么? setOutputData
/getOutputData
对似乎更多地用于 Worker
之间的通信(我在链接时需要)而不是 UI.
附件是当用户打开同步状态页面(2 项已完成,其余进行中)时的截图(在我的应用程序的 [测试] 版本中使用我的旧方法)。
在最终产品中,用户将能够取消任何正在进行的工作并重新发出一次性工作请求。通常这些工作将被 PeriodicWorkRequest
.
解雇
最好的方法是将中间进度写入您自己的数据存储并公开一个 LiveData<>
。我们正在考虑在未来的 alpha 中添加此功能。
本地支持
implementation 'androidx.work:work-runtime:2.5.0'
报告工人的进度:
public class FooWorker extends Worker {
public FooWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
try {
setProgressAsync(new Data.Builder().putInt("progress", 0).build());
Thread.sleep(1000);
setProgressAsync(new Data.Builder().putInt("progress", 50).build());
Thread.sleep(1000);
setProgressAsync(new Data.Builder().putInt("progress", 100).build());
return Result.success();
} catch (InterruptedException e) {
e.printStackTrace();
return Result.failure();
}
}
}
观察Worker的进度:
WorkManager.getInstance(context).getWorkInfosForUniqueWorkLiveData("test").observe(lifecycleOwner, new Observer<List<WorkInfo>>() {
@Override
public void onChanged(List<WorkInfo> workInfos) {
if (workInfos.size() > 0) {
WorkInfo info = workInfos.get(0);
int progress = info.getProgress().getInt("progress", -1);
//Do something with progress variable
}
}
});
ListenableWorker now supports the setProgressAsync() API, which allows it to persist intermediate progress. These APIs allow developers to set intermediate progress that can be observed by the UI. Progress is represented by the Data type, which is a serializable container of properties (similar to input and output, and subject to the same restrictions).
我想用新的 JetPack WorkManager (link to codelabs) 组件(在应用程序的沙箱分支中)替换现有数据同步系统的作业调度方面。我现有的系统运行良好,但 WorkManager
中的一些新功能会派上用场(例如链接)。
我当前的系统使用共享 LiveData
将正在进行的工作的进度传达给任何 UI 元素(在我的例子中是 RecyclerView
)观察它(我是实际上SwitchMapping中的ViewModel
变成了SyncItem
s)
data class SyncItem(
val title: String,
private var _progress: Int,
var total: Int) : BaseObservable() {
var progress: Int
@Bindable get() = _progress
set(value) {
_progress = value
notifyPropertyChanged(BR.progress)
}
}
新的 WorkManager
组件有几种方法(getStatusById
、getStatusesByTag
等)可用于通过一个或多个 WorkStatus
es 检索 LiveData ,但这些仅报告粗粒度状态(运行、成功、失败、已取消)。
向 UI 传达进度(例如“546/1234 项已下载”)的推荐方式是什么? setOutputData
/getOutputData
对似乎更多地用于 Worker
之间的通信(我在链接时需要)而不是 UI.
附件是当用户打开同步状态页面(2 项已完成,其余进行中)时的截图(在我的应用程序的 [测试] 版本中使用我的旧方法)。
在最终产品中,用户将能够取消任何正在进行的工作并重新发出一次性工作请求。通常这些工作将被 PeriodicWorkRequest
.
最好的方法是将中间进度写入您自己的数据存储并公开一个 LiveData<>
。我们正在考虑在未来的 alpha 中添加此功能。
本地支持
implementation 'androidx.work:work-runtime:2.5.0'
报告工人的进度:
public class FooWorker extends Worker {
public FooWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
try {
setProgressAsync(new Data.Builder().putInt("progress", 0).build());
Thread.sleep(1000);
setProgressAsync(new Data.Builder().putInt("progress", 50).build());
Thread.sleep(1000);
setProgressAsync(new Data.Builder().putInt("progress", 100).build());
return Result.success();
} catch (InterruptedException e) {
e.printStackTrace();
return Result.failure();
}
}
}
观察Worker的进度:
WorkManager.getInstance(context).getWorkInfosForUniqueWorkLiveData("test").observe(lifecycleOwner, new Observer<List<WorkInfo>>() {
@Override
public void onChanged(List<WorkInfo> workInfos) {
if (workInfos.size() > 0) {
WorkInfo info = workInfos.get(0);
int progress = info.getProgress().getInt("progress", -1);
//Do something with progress variable
}
}
});
ListenableWorker now supports the setProgressAsync() API, which allows it to persist intermediate progress. These APIs allow developers to set intermediate progress that can be observed by the UI. Progress is represented by the Data type, which is a serializable container of properties (similar to input and output, and subject to the same restrictions).