RxJava:一个请求 - >整数列表 - >每个int的请求序列 - >结果列入清单

时间:2017-06-13 08:42:11

标签: java android rx-java

我是RxJava的新手,在构建Observable时遇到了一些困难。

我的任务是:

  1. 查询服务器getExpPointsIdArrayByHouse
  2. 关于服务器响应。我们得到一个包含整数列表
  3. 的对象(RpcDeviceInfoResponse)
  4. 对于每个int值,需要执行对服务器的单独查询。每个查询的结果都是一个对象" ExpPoint"
  5. 最终结果是expPoints列表
  6. 我已经做过的事情:

    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点陷入困境。我有一个整数列表,每个我需要执行一个单独的查询。

1 个答案:

答案 0 :(得分: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(...)