android - 我们应该如何将工作请求与 android 工作管理器中的输入数据链接起来?
问题描述
我正在尝试通过将一个输出传递给另一个来学习工作经理链接
这是我的目标,
我有两个工作请求 WR1(给我 url)和 WR2(向 url 发送请求)
在 WR1 完成之前,我不能也不应该启动 WR2。
WR1 应该返回一个 url,我必须将其作为 inputData 发送到 WR2
我基本上可以在没有链接的情况下做到这一点。但我想在链接中探索它。
这是我正在进行的片段。请帮忙。
WorkManager mWorkManager = WorkManager.getInstance(this);
//WR1
OneTimeWorkRequest urlRequest = new
OneTimeWorkRequest.Builder(UriResolveWorker.class).build();
//WR2
OneTimeWorkRequest pullRequest = new
OneTimeWorkRequest.Builder(PullReplicator.class).build();
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mWorkManager.beginWith(urlRequest)
.then(pullRequest) // I should be able to pass the result of urlRequest.
.enqueue();
}
});
mWorkManager.getWorkInfoByIdLiveData(urlRequest.getId()).observe(this, new
Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if (workInfo != null) {
WorkInfo.State state = workInfo.getState();
// I will get the URL here and i want to pass this to WR2
message = workInfo.getOutputData().getString("work_result");
tvStatus.append("\n"+"state : "+state.toString() + "message : " +message + "\n");
}
}
});
mWorkManager.getWorkInfoByIdLiveData(pullRequest.getId()).observe(this, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
if (workInfo != null) {
WorkInfo.State state = workInfo.getState();
String count = workInfo.getOutputData().getString("work_result");
tvStatus.append("\n"+"state : "+state.toString() + " No of Documents : " +count + "\n");o
}
}
});
解决方案
在UriResolveWorker类的doWork()方法中返回Result对象之前,您可以将 url 传递给 Result.success()。
首先创建Data.Builder()的对象,然后将 url 放入:
Data.Builder outputDataBuilder = Data.Builder();
outputDataBuilder.putString(KEY_URL_STRING, url.toString());
之后,使用 outputDataBuilder 创建 Data 对象:
Data outputData = outputDataBuilder.build();
现在您可以使用outputData返回结果:
return Result.success(outputData);
当第一个完成后, Workmanager将数据发送到pullRequest 。
请在获取数据之前检查 WorkRequest 的状态。例如:
private final Observer<WorkInfo> urlWorkInfo = workInfo -> {
if (workInfo == null) {
return;
}
WorkInfo.State state = workInfo.getState();
if (state.isFinished()) {
String url = workInfo.getOutputData()
.getString(KEY_URL)
if (url != null) {
Log.d(TAG_MAIN_ACTIVITY, url);
} else {
Log.d(TAG_MAIN_ACTIVITY, "Url not found!");
}
} else if (state == WorkInfo.State.RUNNING) {
Log.d(TAG_MAIN_ACTIVITY, "Associated WorkRequest is being executed");
}
};
推荐阅读
- python - 为什么 tkinter.grid() 方法中的“ipady”选项只在小部件下方添加空间?
- python - 如何保存模态并再次加载以使用?
- angular - Angular 5输入keyup.enter错误并减慢应用程序
- apache-spark - Spark SQL 过滤多个相似字段
- javascript - 找到特殊字符时,FullCalendar 停止加载
- android - 为什么数据在片段之间以捆绑的形式传递?
- vba - 在第一个 IF 满足条件时跳转到 IF 语句的末尾
- c++ - gcc vs turbo编译器中的序列点不同的行为
- c# - 如何在没有 System.Configuration 的情况下以编程方式反序列化 xml 文件
- html - 我怎样才能把这些图像放在一起?