如果第一个满足条件,如何继续Rest调用?

时间:2016-08-28 12:13:47

标签: android retrofit rx-java retrofit2

我从简单的Retrofit切换到RXJava,因为我必须进行多次REST调用。但我无法理解如何执行以下操作:

首先,我想调用返回数据有效性的端点,如果必须获取新数据,我必须从其他5个端点获取新数据。检索并保存所有数据后,我必须继续进行新的活动。

我知道如何拨打一个电话,但我不知道如何进行上述操作。非常感谢提示或教程链接。

2 个答案:

答案 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;您可能希望限制此类呼叫的频率。