【问题标题】:doOnNext() never calleddoOnNext() 从未调用过
【发布时间】: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&lt;Throwable&gt; 部分。一定和toList()有关。

【问题讨论】:

  • 订阅时是否会在 onNext() 中发出项目?
  • 你能不能把doOnNext()放在toList()前面试试。
  • 是的,我可以,我也预料到了。问题是 toList() 调用。但是,我必须能够创建一个列表。否则毫无意义。

标签: android rx-android


【解决方案1】:

这不是我的问题的答案,而是我的问题的解决方案

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,而是通过利用 rxJavas toList() 来执行类似于 Java 8 Stream API 的 collect(Collectors.toList()) 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2014-11-23
    • 2017-08-27
    • 2012-08-09
    • 2013-09-04
    • 2011-05-13
    • 2019-06-01
    相关资源
    最近更新 更多