android livedata进行顺序调用

标签 android mvvm retrofit android-livedata

我正在使用 Retrofit,实时数据。我的项目有一种情况,我必须进行网络调用的顺序。如果任何一个失败,它应该返回错误。

目前我有两个实时数据观察员来完成工作,这不是一个好方法,所以我想知道更好的方法或示例代码来处理这种需求。

注意:我没有使用 Rxjava。

查看代码基本逻辑

    String id = "items/1233"; //ID which has to to be deleted
    if (isCustomizedItem) {
        viewModel.deleteEvent(id);
    } else {
        viewModel.createCustomItems();
        viewModel.deleteEvent(id);
    }

实时数据观察者

    viewModel.getItemDeleted().observe(this, serverResponse -> {
        if (serverResponse.status == Status.SUCCESS) {
            Timber.i("Successfully deleted");
        }
    });

    viewModel.itemCreated().observe(this, serverResponse -> {
        if (serverResponse.status == Status.SUCCESS) {
            Timber.i("new items added");
            //Again call delete for specific item
            viewModel.deleteEvent(id);
        }
    });

查看模型代码

    createItems = Transformations.switchMap(eventData, (data) -> {
        if (canCreateItems(data)) {
            return AbsentLiveData.create();
        } else {
            return eventItemRepository.createItems();
        }
    });

    deleteItem = Transformations.switchMap(deleteItem, (item) -> {
        if (!isValidItem(item)) {
            return AbsentLiveData.create();
        } else {
            return eventItemRepository.deleteItem(item);
        }
    });

repo 代码。

public LiveData<Resource<List<Items>>>  createItems() {
    return new NetworkBoundResource<List<Items>> (executors) {
        @NonNull
        @Override
        protected LiveData<ApiResponse<List<Items>>> createCall() {
            return services.createItems();
        }
    }.asLiveData();
}
public LiveData<Resource<EmptyResponse>>  deleteItem(String id) {
    return new NetworkBoundResource<EmptyResponse> (executors) {
        @NonNull
        @Override
        protected LiveData<ApiResponse<EmptyResponse>> createCall() {
            return services.deleteItem(id);
        }
    }.asLiveData();
}

服务接口(interface)。

@GET(Constants.API_PATH+"/createitems/")
LiveData<ApiResponse<List<Items>>> createItems();

@GET(Constants.API_PATH+"/delete/{id}")
LiveData<ApiResponse<EmptyResponse>> deleteItem(@Path("id") String id);

我想同时调用 createItems 和 deleteItem。我怎样才能做到这一点?

最佳答案

最后我写了解决方案。我使用 Mediatorlivedata 观察 viewmodel 上的 livedata 变化。

Method which is responsible for both network call

public LiveData<Resource<EmptyResponse>> updateEvent(RequestCustomEvent request) {
    return new UpdateItineraryRequests<EmptyResponse>(request).asLiveData();
}

和一个将观察 viewmodel 上的实时数据变化的类。

   private class UpdateItineraryRequests<RequestType> {
    private final MediatorLiveData<Resource<RequestType>> result = new MediatorLiveData<>();

    UpdateItineraryRequests(RequestCustomEvent request) {
        startExecution(request);
    }

    void startExecution(RequestCustomEvent request) {
        //First check the its custom or not if its custom then directly change.
        if (request.isCustom()) {
            LiveData<Resource<EmptyResponse>> observable = repo.deleteItem(request.getEventID());
            result.addSource(observable, response -> {
                result.removeSource(observable);
                if (response.status == Status.SUCCESS) {
                    result.setValue(Resource.success(null));
                } else {
                    result.setValue(Resource.error("unable to delete", null));
                }

            });
        } else {
            LiveData<Resource<List<Items>>> itemsObservable = repo.createItems(request.getDataToChange());
            result.addSource(itemsObservable, response -> {
                result.removeSource(itemsObservable);
                LiveData<Resource<EmptyResponse>> observable = repo.deleteItem(request.getEventID());
                result.addSource(observable, response -> {
                    result.removeSource(observable);
                    if (response.status == Status.SUCCESS) {
                        //Do rest of network calls
                    }

                }
            });
        }

    }

    LiveData<Resource<RequestType>> asLiveData() {
        return result;
    }

}

关于android livedata进行顺序调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50621771/

相关文章:

c# - 使用Caliburn Micro Framework将文件拖放到WPF中

java - Retrofit JSON Error 解析错误

android - 如何从 Activity 中停止在另一个进程中启动的 Intent 服务

android - 用于 View 的 Kotlin 合成扩展

Android Intent startActivityForResult 未正确返回

listview - 如何将 KendoUI ListView 中的选定项目绑定(bind)到我的 observable viewModel 的 selectedItem 属性?

android - Viewpager 动态地从 Arraylist

c# - WPF ListBoxItem 样式是否覆盖了我的 ItemTemplate?

java - 有没有办法使用 Retrofit 2 向每个请求添加查询参数?

java - 如何在改造的GET中使用多个@Path参数