2017-06-13 4 views
0

私はRxJavaの初心者です。Observableの構築中にいくつかの困難があります。RxJava:1つのリクエスト - >整数のリスト - >各int - >結果に対するリストのリスト

私のタスクは次のとおりです。サーバーの応答でサーバーgetExpPointsIdArrayByHouse

    1. クエリ。
    2. int値ごとに、サーバーへの別のクエリを実行する必要があります。

      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. Iで捕まってしまった:各クエリの結果は、オブジェクト「ExpPoint」

    3. 最終結果は、私がすでにやったexpPoints

    のリストであります整数のリストがあり、それぞれ別々のクエリを実行する必要があります。

  • 答えて

    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'を返していない場合は 'yes'を、代わりに' map'を使います。しかし、あなたはHTTPリクエストを作成しているので、あなたのサービスが 'Observable'を返すように[Retrofit](http://square.github.io/retrofit/)に移動してAPIを変更することを検討しているので、 – Pelocho

    関連する問題