【问题标题】:Not understanding Observable.from and Observable.just in RxJava不理解 RxJava 中的 Observable.from 和 Observable.just
【发布时间】:2019-07-05 12:53:58
【问题描述】:

我是 Rxjava 的新手。我正在关注一个视频教程,其中有一个调用 API 并使用平面图获取字符串结果的代码示例。下面是代码:

twitchAPI.getTopGamesObservable()
                .flatMap(new Func1<Twitch, Observable<Top>>() {
            @Override
            public Observable<Top> call(Twitch twitch) {
                Observable<Top> rtnTop =  Observable.from(twitch.getTop());
                Log.d("LogRx", "Size for FROM:"  + "\n");

                return rtnTop;
            }
        })
                .flatMap(new Func1<Top, Observable<String>>() {
            @Override
            public Observable<String> call(Top top) {
                Log.d("LogRx", "Size for JUST:"  + "\n");
                return Observable.just(top.getGame().getName());
            }
        })
                .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {     }

            @Override
            public void onError(Throwable e) {    }

            @Override
            public void onNext(String s) {  Log.d("LogRx", s);      }

        });

但我并没有真正理解这段代码如何工作的顺序。

混淆是因为 observable.from() 和 observable.just()。我知道 observable.from() 将为列表提供 N 个排放量,而 observable.just() 将提供 1 个排放量(一个列表)。

那么,这是否意味着第二个 flatMap 被调用了 N 次,因为第一个 flatMap 内的 Observable.from() 每次都会发出列表中的每个项目。对于第二个平面图,订阅者的 onNext() 也被调用 N 次(每次调用第二个平面图一次)?

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    那么,这是否意味着第二个 flatMap 被调用了 N 次,因为第一个 flatMap 中的 Observable.from() 每次都会发射列表中的每个项目。

    第二张平面图(.flatMap(new Func1&lt;Top, Observable&lt;String&gt;&gt;() {)被称为twitch.getTop().size()次。

    对于第二个 flatMap,订阅者的 onNext() 也被调用了 N 次

    这是真的。根据Top,你会得到一个 observable,每个都有一个值。传递给onNext 的值的数量等于Tops 的数量。

    这使得第二张平面地图有点臃肿。你也可以map 一个TopString


    无关:您可能想查找更新的教程。 RxJava1 差不多一年前就死了。

    RxJava 1.x 现已正式生命周期结束 (EOL)。在版本 1.3.8 和 [2018 年 3 月 31 日] 之后,此项目将不再提供进一步的开发、错误修复、增强、javadoc 更改或维护。

    鼓励用户migrate to 2.x。因此,该 wiki 将在未来几个月内更新以描述 2.x 的特性和属性。

    来源:https://github.com/ReactiveX/RxJava/releases/tag/v1.3.8

    【讨论】:

    • 感谢 RxJava2 的建议。但是对答案还是有点困惑。第二张平面图(.flatMap(new Func1&lt;Top, Observable&lt;String&gt;&gt;() {)被称为twitch.getTop().size()次。所以,我的理解是-first flatMap 正在逐一发射,twitch.getTop().size() 次。那么它不应该每次都在第一个 flatMap 内执行 Log Log.d("LogRx", "Size for FROM:" + "\n"); 的代码吗?如果不是,那么它如何在第二个flatMap 中存储和循环每个项目?
    • 第一个平面地图执行一次。它需要一个 Twitch 并生成 N 个 Observable&lt;Top&gt;。第二个平面图执行 N 次 - 每个Top 一次。第二张平面地图取一张Top 并制作一张Observable&lt;String&gt;。现在你有 N 次Observable&lt;String&gt;,每个都会发出一个String。最后 onNext 将运行 N 次 - 每个 String 运行一次。这是说明flatMap 的最糟糕的例子。平面地图每个项目执行一次,而不是每个可观察对象执行一次。 reactivex.io/documentation/operators/flatmap.html 同样,第二张平面地图应改为 map
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2014-09-15
    • 2020-09-22
    相关资源
    最近更新 更多