【问题标题】:How to make Observable that emit character after 1 second of time interval如何使 Observable 在 1 秒的时间间隔后发出字符
【发布时间】:2017-10-17 10:13:50
【问题描述】:

我刚刚开始使用 RxJava/android,为了练习和入门,我想制作可观察的,每 1 秒发出字符串中的字符,我该怎么做?到目前为止,这是我尝试过的,它只是一次发出字符串:

Observable<String> myObservable = Observable.interval(5000L, TimeUnit.MILLISECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .just("Hello");

我想要这样的你好,在 1 秒后发出 E 等第一次发出 H,依此类推

【问题讨论】:

    标签: java android rx-java rx-android rx-java2


    【解决方案1】:

    使用flatMap()将字符串“hello”拆分为字母“h”、“e”、...“o”。

    new ArrayList&lt;&gt;(Arrays.asList(string.split("")))) 构造 List&lt;String&gt; lettersObservable.fromIterable(letters) 将每个字母发送到下游。

    然后zipWith() 压缩两个Observable,一个是字母,另一个是1秒时间。

    public static void main(String[] args) throws InterruptedException {
    
        Observable.just("Hello")
                .flatMap(string -> Observable.fromIterable(new ArrayList<>(Arrays.asList(string.split("")))))
                .zipWith(Observable.interval(0, 1, TimeUnit.SECONDS), (letter, time) -> letter)
                .subscribe(System.out::println);
    
        Thread.sleep(5000);
    }
    

    打印:

    H
    e
    l
    l
    o
    
    Process finished with exit code 0
    

    【讨论】:

      【解决方案2】:

      您可以zip 使用字符生成源的间隔,例如StringFlowable.characters() 扩展运算符:

      StringFlowable.characters("Hello world")
      .zipWith(Flowable.interval(1000L, TimeUnit.MILLISECONDS), (a, b) -> a)
      .observeOn(AndroidSchedulers.mainThread())
      .blockingSubscribe(System.out::print, Throwable::printStackTrace, System.out::println);
      

      .observeOn(AndroidSchedulers.mainThread()).just("Hello");

      注意just 是一个静态方法,它返回一个新的独立Observable,因此在实例方法上调用.just() 与之前的流程无关。

      【讨论】:

      • 也没有理解这个“只是一个返回一个新的独立 Observable 的静态方法”,因为如果我使这个 observable 并保存到 Observable 类型的变量中,并在它应该是 observable 的任何地方使用它,如果它不是那我怎么叫订阅呢
      • 我做了 Observable myObservable = Observable.range(1, 6).interval(5000, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread());像这样它在 1 秒后的发射值,但范围不起作用它没有在 6 上停止它超过 6
      • StringFlowable 位于单独的库中:com.github.akarnokd:rxjava2-extensions:0.17.8。要了解实例方法和静态方法之间的区别,请查看此代码打印的内容:Observable.just("Hello").just("World").subscribe(System.out::println)。您的 IDE 应标记第二个 just 并警告您在实例上调用静态方法,并且此类调用在很大程度上对实例没有影响。
      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多