【发布时间】:2017-06-10 07:34:19
【问题描述】:
给定以下链:
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 的断点和findPoiCollectionById(...) 内部的另一个断点清楚地表明,结果正在从数据库中成功获取!
那么,是什么阻止了doOnNext(...) 被调用?我清楚地在 observable 上调用 subscribe(...)。映射链一直运行到toList()。我从未见过代码遇到doOnError(...),也从未遇到过subscribe(...) 的Action<Throwable> 部分。一定和toList()有关。
【问题讨论】:
-
订阅时是否会在 onNext() 中发出项目?
-
你能不能把doOnNext()放在toList()前面试试。
-
是的,我可以,我也预料到了。问题是 toList() 调用。但是,我必须能够创建一个列表。否则毫无意义。
标签: android rx-android