我们看下面的代码
Observable.just("android").map(new Func1<String, String>() {
@Override
public String call(String s) {
potentialException(s);//可能发生异常的代码
return "";
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: ");
}
});
代码中如果发生了异常,每一个Observerable对象在终结的时候都会调用onCompleted()或者onError()方法,所以会打印”onCompleted”或者”onError”。
这种模式有以下几个优点:
1.只要有异常发生onError()一定会被调用
这极大的简化了错误处理。只需要在一个地方处理错误即可以。
2.操作符不需要处理异常
将异常处理交给订阅者来做,Observerable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。
3.你能够知道什么时候订阅者已经接收了全部的数据。
知道什么时候任务结束能够帮助简化代码的流程。
调度器
使用subscribeOn()指定被观察者代码运行的线程,使用observerOn()指定订阅者运行的线程
myObservableServices.retrieveImage(url)
.subscribeOn(Schedulers.io())//在IO线程运行
.observeOn(AndroidSchedulers.mainThread())//在主线程运行
.subscribe(bitmap -> myImageView.setImageBitmap(bitmap));
订阅
Observable对象调用subscribe函数会返回一个Subscription对性爱那个名代表了被观察者和订阅者之前的关系
Subscription sub = Observable.just("android").subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted: ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onNext(String s) {
Log.d(TAG, "onNext: ");
}
});
Subscription 有两个方法
第一个方法,是否取消了订阅,第二个方法,取消订阅