【问题标题】:android livedata make sequential callandroid livedata进行顺序调用
【发布时间】:2018-11-10 07:37:20
【问题描述】:

我正在使用 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);
        }
    });

回购代码。

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

服务接口。

@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。我怎样才能做到这一点?

【问题讨论】:

    标签: android mvvm retrofit android-livedata


    【解决方案1】:

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

    负责两个网络调用的方法

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

    还有一个类将观察视图模型上的实时数据变化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多