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进行顺序调用的主要内容,如果未能解决你的问题,请参考以下文章