2017-06-09 32 views
0

鉴于以下链:doOnNext()从来没有所谓的

public Observable<List<PoiCollection>> findPoiCollectionsByUserId(Integer userId) { 
    return findUserGroupsByUserId(userId) 
      .flatMapIterable(
        userGroups -> userGroups) 
      .flatMap(
        userGroup -> findPoiCollectionToUserGroupsByUserGroupId(userGroup.getId())) 
      .flatMapIterable 
        (poiCollectionToUserGroups -> poiCollectionToUserGroups) 
      .flatMap(
        poiCollectionToUserGroup -> { 
         Observable<PoiCollection> poiCollectionById = findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId()); 
         return poiCollectionById; 
        }) 
      .toList() 
      .doOnNext(poiCollections -> { 
       Timber.d("poi-collections from DB:", poiCollections); 
       for(PoiCollection collection : poiCollections) { 
        Timber.d("collection:", collection); 
       } 
      }) 
      .doOnError(throwable -> 
        Timber.e("error fetching poi-collections for user from DB")); 
} 

被调用是这样的:

Observable<List<PoiCollection>> fromDB = databaseHelper.findPoiCollectionsByUserId(id); 

fromDB.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(
       poiCollections -> { 
        Activity activity = (Activity) getView(); 
          Intent intent = new Intent(activity, PoiCollectionsActivity.class); 
        intent.putExtra("poi_collections", (Serializable) poiCollections); 
        activity.startActivity(intent); 
        activity.finish(); 
       }, 
       throwable -> { 
        if (throwable instanceof SocketTimeoutException) { 
         getView().showInternetDialog(); 
        } 
       }); 

,我发现自己不知道为什么没有doOnNext(...)也不doOnError(...)被调用。链正在执行,直到toList(),因此下面的行被执行,之后它才停止。

poiCollectionToUserGroup -> { 
      Observable<PoiCollection> poiCollectionById = findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId()); 
      return poiCollectionById; 
     }) 

断点在poiCollectionById,并从DB顺利另一个内部findPoiCollectionById(...)清楚地表明,其结果,正在获取!

那么,什么能阻止doOnNext(...)被调用?我明确调用subscribe(...)上的可观察。映射链运行至toList()。我从来没有看到代码运行到doOnError(...),我也没有碰到subscribe(...)Action<Throwable>部分。必须与toList()有关。

+0

订阅时,你是否在onNext()中获取物品? – Ritesh

+0

你可以把doOnNext()放在toList()之前并尝试。 – Ritesh

+0

是的,我可以,我也很期待。问题是toList()调用。但是,我必须能够创建一个列表。否则毫无意义。 –

回答

0

这不是一个回答我的问题,但我的问题

public Observable<List<PoiCollection>> findPoiCollectionsByUserId(Integer userId) { 

    List<PoiCollection> poiCollections = new ArrayList<>(); 

    findUserGroupsByUserId(userId) 
      .flatMap(Observable::from) 
      .flatMap(userGroup -> findPoiCollectionToUserGroupsByUserGroupId(userGroup.getId())) 
      .flatMap(Observable::from) 
      .flatMap(poiCollectionToUserGroup -> findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId())) 
      .doOnNext(collection -> poiCollections.add(collection)) 
      .subscribe(); 

    return Observable.just(poiCollections); 
} 

的解决方案我真的希望我还没有创建ArrayList,而是做一些像Java 8的collect(Collectors.toList())方法通过利用rxJavas toList()流API。

相关问题