RxJava组合两个请求疑问:为何返回Integer列表及如何获取MapsItem列表
让我来帮你拆解这两个问题:
1. 为什么onSuccess返回的是List<Integer>?
问题出在你flatMap操作符的第二个参数上:
(indoorMap, uMap) -> Log.i(TAG, "MapsItem: " + new MapsItem(indoorMap, uMap))
Android的Log.i()方法的返回值是int类型(它会返回成功写入日志的字符总数)。当你调用toList()时,RxJava会收集这个flatMap输出的所有int值,最终就形成了List<Integer>,所以你的SingleObserver的泛型被自动推导成了这个类型,onSuccess也就拿到了List<Integer>。
2. 如何获取indoorMap与uMap组合而成的MapsItem列表?
你只需要调整flatMap的结果转换器,让它返回MapsItem实例,而不是Log.i的返回值,同时更新观察者的泛型即可。修改后的代码如下:
requestToServiceGetMaps(idVenue, accessToken) .flatMap(uMapsResponse -> Observable.just(uMapsResponse.getIndoorMaps())) .flatMapIterable(indoorMap -> indoorMap) .flatMap( indoorMap -> requestToServiceGetMapImageUrl(idVenue, indoorMap.getId(), accessToken), (indoorMap, uMap) -> { // 先完成日志打印,再返回组合好的MapsItem MapsItem mapsItem = new MapsItem(indoorMap, uMap); Log.i(TAG, "MapsItem: " + mapsItem); return mapsItem; } ).toList() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new SingleObserver<List<MapsItem>>() { @Override public void onSubscribe(Disposable d) { } @Override public void onSuccess(List<MapsItem> mapsItems) { // 这里就能拿到你需要的MapsItem列表了 } @Override public void onError(Throwable e) { } });
核心改动点:
- 在
flatMap的结果转换器中,先创建MapsItem实例,打印日志后返回这个实例 - 将
SingleObserver的泛型从List<Integer>改为List<MapsItem>,这样onSuccess就能接收正确的列表了
内容的提问来源于stack exchange,提问作者Amine Harbaoui
相关产品推荐
相关产品推荐

