我从简单的Retrofit切换到RXJava,因为我必须进行多次REST调用。但我无法理解如何执行以下操作:
首先,我想调用返回数据有效性的端点,如果必须获取新数据,我必须从其他5个端点获取新数据。检索并保存所有数据后,我必须继续进行新的活动。
我知道如何拨打一个电话,但我不知道如何进行上述操作。非常感谢提示或教程链接。
答案 0 :(得分:0)
尝试我在我的应用程序中使用的以下简单方法:使用事件
在build.gradle
模块级文件中:
compile 'org.greenrobot:eventbus:3.0.0'
然后,只需创建一个代表您的事件的POJO
类:
public class DataValidationEvent{
private boolean isDataValid;
public DataValidationEvent(boolean isValid){
this.isDataValid = isValid;
}
public boolean isDataValid(){
return isDataValid;
}
}
然后,在收到表明数据是否有效的响应(来自该端点)的HTTP Request
中,通知某个类或活动进行下一个操作,例如制作预期的request
。像这样:
if(responseIsValid){
EventBus.getDefault().post(new DataValidationEvent(true));
}else{
EventBus.getDefault().post(new DataValidationEvent(false));
}
//obviously, you can simplify the above code to a one-liner
//by passing the actual variable returned
接下来,在您需要触发其他http requests/operations
的活动中,执行以下操作:
@Override public void onStart(){
super.onStart();
EventBus.getDefault().register(this);
}
@Override public void onStop(){
super.onStop();
EventBus.getDefault().unregister(this);
}
最后,在您为上述事件注册的同一活动中,您需要处理(subscribe
)事件,如下所示:
@Subscribe
public void onValidResponse(DataValidationEvent event){
//here you can call the next api request or start activity.
}
我知道这可能无法完成您想做的所有事情,但应引导您使用Event-driven
解决方案,使用流行的publisher/subscriber
设计模式解耦您的项目!
祝你好运,我希望这会有所帮助!
答案 1 :(得分:0)
快速而肮脏的功能解决方案,假设apiClient
是改进客户端,而cacheData保存并返回缓存的数据对象:
Observable<Data> dataObs =
apiClient
.isDataValid()
.filter(data -> !data.isValid)
.flatMap(oldData -> Observable.zip(
apiClient.fetchA(),
apiClient.fetchB(),
apiClient.fetchC(),
apiClient.fetchD(),
apiClient.fetchE(),
(a,b,c,d,e) -> cacheData(a,b,c,d,e))
.switchIfEmpty(Observable.defer(() -> getFromCache()));
请注意,每次订阅时都会调用API;您可能希望限制此类呼叫的频率。