返回

RxJava系列四:doOnNext不显山不露水,却独具魅力!

Android

RxJava 系列四:doOnNext 不显山不露水,却独具魅力!

从“隐秘角落”窥见 doOnNext 的魅力

如果在 RxJava 系列课程中选择一个存在感最弱、最容易被忽视的操作符,那么 doOnNext 必然榜上有名。它作为 RxJava 家族中的一员,其作用是:允许我们在流中指定事件的处理行为。

看似不起眼的 doOnNext,却在流中发挥着不可替代的作用。不信?那就跟随本教程,进入今天的“隐秘角落”,共同挖掘 doOnNext 的独特魅力。

“串口编程”的 RxJava 实践之旅

今天,我们以一个常见的任务场景——“串口编程”作为案例,带你领略 doOnNext 的精髓。

串口编程的一个常见需求是,需要在异步线程中读取串口数据,并在主线程中展示。我们可以在 RxJava 中使用 Observable 的 create 操作符创建一个无限流,在异步线程中不断地读取串口数据。

doOnNext 的闪亮登场

根据我们的需求,我们需要在读取到数据时,将其显示在主线程的 TextView 中。此时,就需要 doOnNext 操作符发挥作用了。它允许我们指定一个回调函数,每当流中产生一个新事件(也就是读取到数据时),该回调函数就会被触发。

在回调函数中,我们可以执行相应的操作,例如将数据显示在 TextView 中。以下代码演示了如何使用 doOnNext 来实现这一需求:

Disposable disposable = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        // 异步线程中读取串口数据
        while (!emitter.isDisposed()) {
            emitter.onNext("串口数据:xxxxxx");
            Thread.sleep(1000);
        }
    }
})
.doOnNext(new Consumer<String>() {
    @Override
    public void accept(String data) throws Exception {
        // 主线程中显示数据
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textView.setText(data);
            }
        });
    }
})
.subscribe();

doOnNext 的优点与意义

通过这个案例,我们可以看到 doOnNext 操作符具有以下优点:

  • 方便性:doOnNext 允许我们以一种简洁的方式在流中添加处理逻辑,而无需创建新的 Observable 或操作符。
  • 扩展性:doOnNext 可以与其他 RxJava 操作符组合使用,从而实现更复杂的需求。
  • 鲁棒性:doOnNext 可以在异常情况下(例如,当流产生错误时)提供处理逻辑,从而使流能够继续运行,并避免崩溃。

结语

综上所述,doOnNext 虽然是一个不起眼的小小操作符,但它却在 RxJava 中发挥着举足轻重的作用。它使我们在流中添加处理逻辑变得更加容易,并为流提供了更大的扩展性和鲁棒性。