# 概念理解
一种观察者模式,封装了极方便的线程操作,可以用于嵌套回调机制使代码更加清晰。
# 定义
Observer:观察者,设置被观察者有什么行为时调用RxJava接口的实现方法。onNext、onCompleted、onError。
Subscriber:订阅者,与Observer相同(实现该类的抽象类),对Observer的接口进行的扩展,多了两个方法:
- 1、onStart:可在开始前做初始化工作。
- 2、unSubscribe:是Subscriber实现另一个接口doOnSubscription的方法。用于取消订阅。
Observable:被观察者。决定什么时候除法什么事件。
# 一般过程:
1. 首先创建观察者(或订阅者),定义观察这接收到被观察者某个状态(动作)的响应。
2. 创建被观察者的,设置他的动作内容。
3. 为被观察者添加观察者。
例:
```java
//1、创建被观察者
ObservablemyObservableNormal=Observable.create(newObservable.OnSubscribe(){
@Override
publicvoidcall(Subscribersubscriber){
for(inti=0;i<4;i++){
subscriber.onNext(i+"");//执行动作
}
subscriber.onCompleted();//执行动作
}
});
//2、创建观察者
SubscribermySubscriberNormal=newSubscriber(){
@Override
publicvoidonCompleted(){
Log.e("TAG","onCompleted");
}
@Override
publicvoidonError(Throwablee){
Log.e("TAG","onError");
}
@Override
publicvoidonNext(Strings){
Log.e("TAG","onNext");
Log.e("TAG",s);
}
};
//1、为被观察者添加观察者
myObservableNormal.subscribe(mySubscriberNormal);
```
## 多种操作模式
### 1、基本方法:
例:
```java
//1、创建被观察者
ObservablemyObservableNormal=Observable.create(newObservable.OnSubscribe(){
@Override
publicvoidcall(Subscribersubscriber){
for(inti=0;i<4;i++){
subscriber.onNext(i+"");
}
subscriber.onCompleted();
}
});
//2、创建观察者
SubscribermySubscriberNormal=newSubscriber(){
@Override
publicvoidonCompleted(){
Log.e("TAG","onCompleted");
}
@Override
publicvoidonError(Throwablee){
Log.e("TAG","onError");
}
@Override
publicvoidonNext(Strings){
Log.e("TAG","onNext");
Log.e("TAG",s);
}
};
//3、为被观察者添加观察者
myObservableNormal.subscribe(mySubscriberNormal);
```
### 2、简化1:发送一系列动作
使用just方法传递数据
```java
//1使用just
Observable.just("simple_just_1","simple_just_2","simple_just_3").subscribe(mySubscriberNormal);
//2使用from
String[]fromStr={"str1","str2","str3","str4","str1"};
Observable.from(fromStr).subscribe(mySubscriberNormal);
```
### 3、简化2:观察者只关注过程变化(只关注被观察者的onNext动作)
先拆分观察者:
```java
//拆分的观察者——出错动作
Action1onErrorAction=newAction1(){
@Override
publicvoidcall(Throwablethrowable){
}
};
//拆分的观察者——结束动作
Action0onCompletedAction=newAction0(){
@Override
publicvoidcall(){
}
};
//拆分的观察者——下一个动作
Action1onNextAction=newAction1(){
@Override
publicvoidcall(Strings){
Log.e("TAG","onNextAction");
Log.e("TAG",s);
}
};
//注册观察者:只关注过程
myObservableNormal.subscribe(onNextAction);
//4、添加所有拆分的观察者
```java
myObservableNormal.subscribe(onNextAction,onErrorAction,onCompletedAction);
```
# 操作符的使用
RXjava提供多种变换符可以在被观察者传递数据个观察者的过程中对数据进行操作:
## 1、map变化符
```java
//1变换(String->String)
myObservableNormal.map(newFunc1(){
@Override
publicStringcall(Strings){
returns+"-lw";
}
}).subscribe(mySubscriberNormal);
//2多层转换(String->Boolean->String)
myObservableNormal.map(newFunc1(){
@Override
publicBooleancall(Strings){
if(s.length()>5){
returnfalse;
}else{
returntrue;
}
}
}).map(newFunc1(){
@Override
publicStringcall(BooleanaBoolean){
returnaBoolean?"长度大于5":"长度小于5";
}
}).subscribe(mySubscriberNormal);
```
## 2、使用flatMap
flatMap与map的区别:
map变换的被观察者和观察者是一对一的关系
flatMap变换的被观察着和观察者是一对多的关系
实现原理:flatMap通过变换可以在中间返回多个被观察者,而这个被观察者可以注册之前注册的观察者。
```java
myObservableNormal.flatMap(newFunc1>(){
@Override
publicObservablecall(Strings){
ArrayListstrs=newArrayList<>();
for(chara:s.toCharArray()){
strs.add(String.valueOf(a));
}
returnObservable.from(strs);
}
}).subscribe(mySubscriberNormal);
```
# RxJava的多线程
Rx提供机器方便的线程调度方式,在被观察者注册观察者是只要通过设置
subscribeOn()和observeOn()两个方法并传入参数就可以设置被观察者和观察者执行的线程了。在传入线程参数的时候需要使用RxJava线程调度器Scheduler。
PS:默认的观察者,被观察者的回调都是在同一线程的。
例子:
```java
Observable.just("str1","str2")
.subscribeOn(Schedulers.newThread())//开启器新线程
.observeOn(AndroidSchedulers.mainThread())//回到主线程线程
.subscribe(newAction1(){
@Override
publicvoidcall(Strings){
}
});
```
## 关于线程调度器的参数具体情况:
Schedulers.immediate():默认线程,即默认参数。相当于运行在当前线程。
Schedulers.newThread():启开启新线程,并在新线程执行操作。
Schedulers.io():I/O操作
PS:在Android中可以使用AndroidSchedulers.mainThread()回到主线程。
学习资料:http://gank.io/post/560e15be2dca930e00da1083