在WorkManager中使用RxWorker进行API调用

4

我正在尝试使用RxWorker访问工作类的工作信息。以下是工作类的代码:

public class OrderSyncWorker extends RxWorker {

@NonNull
@Override
public Single<Result> createWork() {

    List<Order> ordersToBeSynced = databaseRepository.getNonSyncedOrders();
    JSONArray orders = new JSONArray();
    try {
        JSONObject request = new JSONObject(); mApiManager.syncOrders(request).flatMap((Function<ApiResponse, Single<Result>>) apiResponse -> {
            if (apiResponse.getSuccess() == 1) {
                databaseRepository.syncAllOrders();
                mNotificationUtils.showNotification("Orders synced", "", true);
                return Single.just(Result.success());
            } else {
                mNotificationUtils.showNotification("Orders not synced", "Unknown error", true);
                return Single.just(Result.failure());
            }
        }).onErrorReturn(throwable -> {
            mNotificationUtils.showNotification("Orders not synced", Utils.parseError(throwable), true);
            return Result.failure();
        });
        subscription.subscribe();
        return subscription;
    } catch (JSONException e) {
        return Single.just(Result.failure());
    }
}

这是我如何初始化工作请求。

Constraints constraints = new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED)
            .build();
    OneTimeWorkRequest orderSyncRequest = new OneTimeWorkRequest.Builder(OrderSyncWorker.class)
            .setInputData(new Data.Builder().putString("macId", macId).build())
            .setConstraints(constraints)
            .addTag("sync_orders")
            .build();
    WorkManager.getInstance().enqueue(orderSyncRequest);

尝试通过以下方式获取工作信息的 LiveData:

  workInfos = WorkManager.getInstance().getWorkInfosByTagLiveData("sync_orders");


viewModel.observeonWorkStatus().observe(this, new Observer<List<WorkInfo>>() {
        @Override
        public void onChanged(@Nullable List<WorkInfo> workInfos) {
            if (workInfos == null || workInfos.isEmpty()) {
                return;
            }
            WorkInfo workInfo = workInfos.get(0);

            boolean finished = workInfo.getState().isFinished();
            if (!finished) {
                syncButton.setEnabled(false);
            } else {
                syncButton.setVisibility(View.GONE);
            }
        }
    });

但观察者并没有被击中。有什么想法吗?

你能展示一下加入Worker的代码吗? - pfmaggi
WorkManager.getInstance().enqueue(orderSyncRequest); - Nidhin Rejoice
你能补充一下如何构建WorkRequest的问题吗? - pfmaggi
已更新答案。 - Nidhin Rejoice
1个回答

0
首先,关于不使用字符串字面量作为标签的个人建议,请考虑为其定义一个常量:
static final String TAG_SYNC_ORDERS = "SYNC_ORDERS";

从您的代码来看,似乎您从WorkRequest中获取了LiveData:

LiveData<List<WorkInfo>> workInfos = WorkManager.getInstance().getWorkInfosByTagLiveData("sync_orders");

然后你从ViewModel使用另一个LiveData(?):

viewModel.observeonWorkStatus()

我假设它们是相同的。如果不是,那就是一个问题。

现在重写你的LiveData观察者:

static final String TAG_SYNC_ORDERS = "SYNC_ORDERS";

LiveData<List<WorkInfo>> workInfos = WorkManager.getInstance().getWorkInfosByTagLiveData(TAG_SYNC_ORDERS);
workInfos.observe(this, listOfWorkInfo -> {

    // If there are no matching work info, do nothing
    if (listOfWorkInfo == null || listOfWorkInfo.isEmpty()) {
        return;
    }

    // We only care about the one output status.
    WorkInfo workInfo = listOfWorkInfo.get(0);
    boolean finished = workInfo.getState().isFinished();

    if (!finished) {
        syncButton.setEnabled(false);
    } else {
        syncButton.setVisibility(View.GONE);
    }
});

您可以参考WorkManager代码实验室获得更多类似示例。


嘿,感谢您的回答。但是有些混淆。viewmodel正在从activity观察由workmanager发出的livedata。我忘记在那里写了。有一个名为 public LiveData<List<WorkInfo>> observeonWorkStatus() { return workInfos; } 而且view正在观察这个workInfos live data。但我的问题是这个观察者没有被触发。 - Nidhin Rejoice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接