And*_*tus 5 android android-jetpack android-workmanager
我想用新的JetPack WorkManager(链接到codelabs)组件(在应用程序的沙箱分支中)替换现有数据同步系统的作业调度方面.我现有的系统运行良好,但其中的一些新功能WorkManager会派上用场(例如链接).
我当前的系统使用共享LiveData来传递从正在进行的作业到任何UI元素(RecyclerView在我的情况下)观察它的进度(我实际上是将SwitchMapping ViewModel放入SyncItems 的列表中)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
新WorkManager组件有几种方法(getStatusById,getStatusesByTag等),可用于检索带有一个或多个WorkStatuses 的LiveData ,但这些只报告一个课程粒度状态(运行,成功,失败,取消).
推荐进展的方式是什么(例如'546/1234项下载')到用户界面?的setOutputData/ getOutputData对似乎是用来更之间通信Worker总比与UI(我链接时需要).
附件是当用户打开同步状态页面时(在2个项目已完成,正在进行中),它的外观截图(使用我的旧方法在我的应用程序的[测试]版本中).
在最终产品中,用户将能够取消正在进行的任何作业并重新发出一次性工作请求.通常情况下,工作将被解雇PeriodicWorkRequest.
本地支持
implementation 'androidx.work:work-runtime:2.5.0'
Run Code Online (Sandbox Code Playgroud)
报告 Worker 的进度:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
观察 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
}
}
});
Run Code Online (Sandbox Code Playgroud)
ListenableWorker 现在支持 setProgressAsync() API,它允许它保持中间进度。这些 API 允许开发人员设置 UI 可以观察到的中间进度。进度由 Data 类型表示,它是一个可序列化的属性容器(类似于输入和输出,并受到相同的限制)。
| 归档时间: |
|
| 查看次数: |
1921 次 |
| 最近记录: |