返回
RxJava系列四:doOnNext不显山不露水,却独具魅力!
Android
2023-12-27 13:42:20
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 中发挥着举足轻重的作用。它使我们在流中添加处理逻辑变得更加容易,并为流提供了更大的扩展性和鲁棒性。