Использование RxWorker для API-вызовов в WorkManager
Я пытаюсь получить доступ к рабочей информации рабочего класса при использовании 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);
Попытка получить Work info Liveata, как это
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);
}
}
});
Но наблюдатель не получает удар. Какие-нибудь мысли?
1 ответ
Во-первых, личное замечание о том, что для вашего тега не следует использовать строковый литерал, рассмотрите возможность определения для него константы:
static final String TAG_SYNC_ORDERS = "SYNC_ORDERS";
Глядя на ваш код, кажется, что вы получили LiveData из вашего WorkRequest как:
LiveData<List<WorkInfo>> workInfos = WorkManager.getInstance().getWorkInfosByTagLiveData("sync_orders");
но затем вы используете другую LiveData(?) из ViewModel:
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 для более похожего примера.