2017-06-13 40 views
0

我是RxJava的新手,构建Observable时遇到一些困难。RxJava:一个请求 - >整数列表 - >每个int的请求顺序 - >列表结果

我的任务是:

  1. 查询到服务器getExpPointsIdArrayByHouse
  2. 服务器响应。我们得到一个包含整数列表的对象(RpcDeviceInfoResponse)
  3. 对于每个int值,需要执行对服务器的单独查询。每个查询的结果是一个对象“ExpPoint”
  4. 最终的结果是expPoints

的名单我已经做了:

Observable 
     .defer(new Func0() { 
      @Override 
      public Object call() { 
       try { 
        return Observable.just(apiHttpClient.getExpPointsIdArrayByHouse(houseId)); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return Observable.error(e); 
       } catch (RightsException e) { 
        e.printStackTrace(); 
        return Observable.error(e); 
       } 
      } 
     }) 
    .flatMap(new Func1<RpcDeviceInfoResponse, Observable<Integer>>() { 
     @Override 
     public Observable<Integer> call(RpcDeviceInfoResponse rpcResponse) { 

      if (rpcResponse.getResult().size() == 0) { 
       errorReport(false, context.getResources().getString(R.string.error_while_getting_exp_points), ""); 
       return null; 
      } 

      RpcDeviceInfoResponse.TaskListResult result = rpcResponse.getResult().get(0); 
      return Observable.from(result.getResult()); 

     } 
    }) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribeOn(Schedulers.io()) 
    .subscribe(new Observer<Integer>() { 
     @Override 
     public void onCompleted() { 
      Log.v("onCompleted", "onCompleted"); 
     } 

     @Override 
     public void onError(Throwable e) { 
      Log.v("onError", "onError"); 
     } 

     @Override 
     public void onNext(Integer integer) { 
      Log.v("onNext", "onNext"); 


     } 
    }); 

我被困在点3.我有一个整数列表,每个我需要执行一个单独的查询。

回答

0

你已经有一个Observable<Int>所以你可以使用flatMap

Observable.defer(
     //first query 
    ).flatMap(
     // convert result to Observable<Int> 
    ) 
    .flatMap(
     someInt -> doSomeQuery(someInt) 
    ) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...) 
+0

在我而言,就我个人而言,这是更好flatMap后使用地图(返回的值是观察不到的)谢谢! – crd

+0

如果'doSomeQuery'没有返回一个'Observable',那么可以使用'map'来代替。但是,由于您正在(假设)HTTP请求考虑转移到[Retrofit](http://square.github.io/retrofit/)并修改您的API,以便您的服务返回“Observable” – Pelocho