RxJava是什么?
如果非要用一句话来概括的话,那就是RxJava是一个异步操作。
RxJava是一个和handler以及AscyTask一样的可以控制线程操作线程的一个异步操作。
既然RxJava和Handler以及AscyTask效果一样,那为什么要使用RxJava而不是干脆直接使用Handler或者AscyTask呐?
这个原因有两点。
第一,RxJava的操作简洁。这里需要说明一下,这里说的简洁是指逻辑上的简洁,并非一些人想象中的少写很多代码那种简洁。
第二,RxJava拥有一系列强大方便的操作符,可以完成很多以前需要复杂代码才能够完成的操作。这点Handler和AscyTask根本做不到RxJava这么好。
RxJava采用的是观察者模式,代码结构是一个响应式链式编程。
什么是观察者模式?
举个例子,警察抓小偷。法律讲究后发制人。当一个小偷还没有偷东西的时候,警察是拿他没办法的,但是警察会死死盯着他,一旦他偷了东西便立马抓获他。观察者模式也是如此。
RxJava中,也是采用观察者模式来设计的。里面有三个身份,观察者(Observer)、被观察者(Observable)、订阅(Subscribe)。其中观察者代表警察,被观察者代表小偷,两者通过订阅联系在一起。指定了这个警察每天24小时专门观察这个小偷的一举一动,如果开始偷东西,便将其抓获。
例子:
首先添加依赖
compile 'io.reactivex.rxjava2:rxjava:2.1.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//被观察者
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//在这里可以做一些数据获取操作,然后将获取的数据处理之后通过onNext方法发射出去
e.onNext("aaa");
e.onNext("bbb");
e.onNext("ccc");
e.onComplete();
}
});
//观察者
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
Log.i("结果:" ,s);
Log.i("结果:" ,s);
Log.i("结果:" ,s);
Log.i("结果:" ,s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i("结束啦","结束啦");
}
};
//绑定
observable.subscribe(observer);
分析上面的代码。被观察者(Observable)通过create()方法创建一个subscribe()方法,里面有个参数ObservableEmitter,这个可以称之为发射器,这个发射器有三个方法。onNext()、onComplete()、onError()。
onNext():
向Observe(观察者) onNext(Object s)方法中发射内容,观察者拿到这个内容之后可以随意操作。
onComplete():
当observable(被观察者)将数据都发送完成之后就可以使用这个方法,代表结束。observer会在onComplete()中回调。我们可以将加载dialog的结束动效放在这个里面
onError():
顾名思义,当出现问题的时候回调这个方法。
最后通过subscribe产生联系,即所谓的订阅。
一般我们在使用的时候都是采用链式结构来使用:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//发射数据
e.onNext("111");
e.onNext("222");
e.onNext("333");
e.onComplete();
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
//初始化或者加载数据
}
@Override
public void onNext(String s) {
Log.i("接受数据",s);
Log.i("接受数据",s);
Log.i("接受数据",s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i("接收完成","finish");
}
});