Rxjava(3.响应式编程好处)

来源:互联网 发布:烟筒防风帽制作数据 编辑:程序博客网 时间:2024/06/05 10:12

参考地址

英文版
中文版
Rxjava(1.基础篇)
Rxjava(2.操作符)
lambda表达式


本文主要分为:

  • 错误处理
  • 调度器
  • 订阅

1.错误处理

onComplete()和onError()函数:
这两个函数用来通知订阅者,被观察的对象将停止发送数据、为什么停止(成功的完成或者出错了)。

下面的代码展示了怎么使用这两个函数:

Observable.just("Hello, world!")    .map(s -> potentialException(s))    .map(s -> anotherPotentialException(s))    .subscribe(new Subscriber<String>() {        @Override        public void onNext(String s) { System.out.println(s); }        @Override        public void onCompleted() { System.out.println("Completed!"); }        @Override        public void onError(Throwable e) { System.out.println("Ouch!"); }    });

上面代码中的potentialException() 和 anotherPotentialException()有可能会抛出异常。
每一个Observerable对象在终结的时候都会调用onCompleted()或者onError()方法,所以Demo中会打印”Completed!”或者”Ouch!”。


  • 这种模式的几个优点:

1.只要有异常发生onError()一定会被调用
………这极大的简化了错误处理。只需要在一个地方处理错误即可以。
2.操作符不需要处理异常
………将异常处理交给订阅者(观察者)来做,Observerable(事件源,被观察者)的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。
3.Rxjava在处理unsubscribing的时候,会停止整个调用链
………如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!


注意:
使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态-一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。

2.调度器

  • 使用调度器的起因

假设你编写的Android app需要从网络请求数据(感觉这是必备的了,还有单机么?)。网络请求需要花费较长的时间,因此你打算在另外一个线程中加载数据。那么问题来了!

编写多线程的Android应用程序是很难的,因为你必须确保代码在正确的线程中运行,否则的话可能会导致app崩溃。最常见的就是在非主线程更新UI。

使用RxJava,你可以使用subscribeOn()指定观察者代码运行的线程,使用observerOn()指定订阅者运行的线程:

myObservableServices.retrieveImage(url)    .subscribeOn(Schedulers.io())    .observeOn(AndroidSchedulers.mainThread())    .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

注意:
任何在我的subscribe前面执行的代码都是在I/O线程中运行。最后,操作view的代码在主线程中运行.

最棒的是我可以把subscribeOn()和observerOn()添加到任何Observable对象上。这两个也是操作符!。我不需要关心Observable对象以及它上面有哪些操作符。仅仅运用这两个操作符就可以实现在不同的线程中调度。

如果使用AsyncTask或者其他类似的,我将不得不仔细设计我的代码,找出需要并发执行的部分。使用RxJava,我可以保持代码不变,仅仅在需要并发的时候调用这两个操作符就可以。


3.订阅(Subscriptions)

当调用Observable.subscribe(),会返回一个Subscription对象。这个对象代表了被观察者和订阅者之间的联系。

ubscription subscription = Observable.just("Hello, World!")
.subscribe(s -> System.out.println(s));

你可以在后面使用这个Subscription对象来操作被观察者和订阅者之间的联系.

subscription.unsubscribe();
System.out.println("Unsubscribed=" + subscription.isUnsubscribed());
// Outputs "Unsubscribed=true"

注意:

RxJava的另外一个好处就是它处理unsubscribing的时候,会停止整个调用链。如果你使用了一串很复杂的操作符,调用unsubscribe将会在他当前执行的地方终止。不需要做任何额外的工作!


回到顶部

0 0
原创粉丝点击