首页 > 解决方案 > 我们应该如何将工作请求与 android 工作管理器中的输入数据链接起来?

问题描述

我正在尝试通过将一个输出传递给另一个来学习工作经理链接

这是我的目标,

  1. 我有两个工作请求 WR1(给我 url)和 WR2(向 url 发送请求)

  2. 在 WR1 完成之前,我不能也不应该启动 WR2。

  3. WR1 应该返回一个 url,我必须将其作为 inputData 发送到 WR2

  4. 我基本上可以在没有链接的情况下做到这一点。但我想在链接中探索它。

这是我正在进行的片段。请帮忙

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 
                }
            }
        });

标签: androidandroid-workmanager

解决方案


在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");

    }
};

推荐阅读