1.错误处理
到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以及为什么停止(成功的完成或者出错了)。
下面的代码展示了怎么使用这两个函数:
public class MainActivity1 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注意这里的参数是 query所返回的Observable的输出,并且返会一个Observable<String>
query().flatMap(new Func1<List<String>, Observable<String>>() {
@Override
public Observable<String> call(List<String> strings) {
//结合from处理
return Observable.from(strings);
}
}).flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
//我们在这里调用`addPre`方法,就行处理
return addPre(s);
}
}).filter(new Func1<String, Boolean>() {//filter 过滤,把不符合条件的过滤掉,留下符合条件的
@Override
public Boolean call(String s) {
return s.contains("a");
}
}).take(3)//take 指定最多输出的数量
.doOnNext(new Action1<String>() {//doOnNext 允许我们在每次输出一个元素之前做一些额外的事情(其实就是在onNext里调用的)
@Override
public void call(String s) {
System.out.println("doOnNext:" + s);
}
}).
subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
//Observerable对象终结
}
@Override
public void onError(Throwable e) {
//错误处理
}
@Override
public void onNext(String s) {
System.out.println("_flatMap:" + s);
}
});
}
static Observable<List<String>> query() {
List<String> s = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
// List<String> s1 = Arrays.asList("Java", "Android", "Ruby", "Ios", "Swift");
return Observable.just(s);
// return Observable.just(s,s1);//可以添加多个Just
}
//增加个函数,用来增加个前缀:
static Observable<String> addPre(String lan) {
return Observable.just("addPre_" + lan);
}
}
代码中的potentialException() 和 anotherPotentialException()有可能会抛出异常。每一个Observerable对象在终结的时候都会调用 onCompleted()或者onError()方法,所以Demo中会打印”Completed!”或者”Ouch!”。
这种模式有以下几个优点:
1.只要有异常发生onError()一定会被调用
这极大的简化了错误处理。只需要在一个地方处理错误即可以。
2.操作符不需要处理异常
将异常处理交给订阅者来做,Observerable的操作符调用链中一旦有一个抛出了异常,就会直接执行onError()方法。
3.你能够知道什么时候订阅者已经接收了全部的数据。
知道什么时候任务结束能够帮助简化代码的流程。(虽然有可能Observable对象永远不会结束)
使用RxJava,Observable对象根本不需要知道如何处理错误!操作符也不需要处理错误状态-一旦发生错误,就会跳过当前和后续的操作符。所有的错误处理都交给订阅者来做。模拟加载网络图片:
public class MainActivity extends Activity {
private ImageView imageView;
int imageId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image_imageView);
imageId = R.drawable.base;
Observable.create(new Observable.OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
//让其休眠5秒中后显示图片
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Drawable drawable = getDrawable(R.drawable.base);
subscriber.onNext(drawable);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) //事件发送,即图片加载在IO线程
.observeOn(AndroidSchedulers.mainThread()) //事件处理,即图片显示在UI线程
.subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
Toast.makeText(getApplicationContext(),"success",Toast.LENGTH_SHORT);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
});
}
}