android livedata进行顺序调用

Posted

技术标签:

【中文标题】android livedata进行顺序调用【英文标题】:android livedata make sequential call 【发布时间】: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。我怎样才能做到这一点?

【问题讨论】:

【参考方案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;
    


【讨论】:

以上是关于android livedata进行顺序调用的主要内容,如果未能解决你的问题,请参考以下文章

vue利用回调函数保证子组件调父组件方法按顺序执行

在单元测试中验证函数调用顺序

Tornado之接口调用时方式执行顺序

android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

汇编对比函数参数进堆栈顺序

Mongoose/Mongodb 数据库调用以不一致的顺序返回数据