一、手写RxJava
1.链式逻辑简洁
RxJava 的Create原理就像一场宇航员登月计划一样
1.宇航员进入火箭进行倒数,OnSubscribe: 订阅成功即将开始发送
2.宇航员倒数结束进行点火升空,subscribe: 开始发射
3.宇航员的火箭分离,onNext: 进行接收
4.宇航员进入太空轨道,onComplete: 接收事件完成
代码示例(RxJava使用例子):
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(Observer<Integer> observableEmitter) {
Log.i(TAG, "2.宇航员倒数结束进行点火升空,subscribe: 开始发射");
observableEmitter.onNext(123);
observableEmitter.onComplete();
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe() {
Log.i(TAG, "1.宇航员进入火箭进行倒数,OnSubscribe: 订阅成功即将开始发送");
}
@Override
public void onNext(Integer item) {
Log.i(TAG, "3.宇航员的火箭分离,onNext: 进行接收 ");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onComplete() {
Log.i(TAG, "4.宇航员进入太空轨道登录月球,onComplete: 接收事件完成 ");
}
});
2. RxJava实现原理
定义、订阅、发射
定义 : create 定义ObservableOnSubscribe source返回Observable对象
订阅 : 后面subscribe进行调用开始订阅,
发射 : ObservableOnSubscribe 的 subscribe Observer 进行发射.
接下来这里介绍3种操作符:Create、Just、Map 如何实现。
2.1 Create
如何实现这种完美的链式结构 create 实现?
就是要把所有的控制权交给对象Observable掌控.
Observable 代码实现:
public class Observable<T> {
ObservableOnSubscribe source;
private Observable(ObservableOnSubscribe<T> source) {
this.source = source;
}
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
return new Observable<T>(source) ;
}
public void subscribe(Observer<T> observer) {
observer.onSubscribe();
source.subscribe( observer);
}
}
注意: 这里面使用了泛型,增加Observable扩展性
2.2 just 实现
just 操作符内嵌发射台.
使用示例:
Observable.just("abc").subscribe(new Observer<String>() {
@Override
public void onSubscribe() {
Log.i(TAG, "onSubscribe ");
}
@Override
public void onNext(String item) {
Log.i(TAG, "onNext "+item);
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError ");
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete ");
}
});
可以发现发射ObservableOnSubscribe 的 subscribe Observer不见了,那是因为在定义just方法里面进行发射了.(内嵌发射台)
手写代码示例:
public static <T> Observable<T> just(final T... t) {
ObservableOnSubscribe onSubscribe= new ObservableOnSubscribe<T>() {
@Override
public void subscribe(Observer<T> observableEmitter) {
for (T t1:t) {
observableEmitter.onNext(t1);
}
observableEmitter.onComplete();
}
};
return new Observable<T>(onSubscribe) ;
}
2.3 map 实现
实现原理:
map 操作符关键在于转换,即如何传入函数 Function 的apply,把发射的内容进行转换再调用onNext进行接收.
解决方案:引入ObservableMap 和MapObserver 把原来的控制权抢过来
map 使用示例代码:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(Observer<String> observableEmitter) {
Log.i(TAG, "宇航员倒数结束进行点火升空,subscribe: 开始发射");
observableEmitter.onNext("123123213");
observableEmitter.onComplete();
}
}).map(new Function<String, Integer>() {
@Override
public Integer apply(String s) throws Throwable {
Log.i(TAG, "apply");
int a = s.length();
Object object= new Object() ;
return a;
}
}).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe() {
Log.i(TAG, "onSubscribe");
}
@Override
public void onNext(Integer item) {
Log.i(TAG, "onNext "+item);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i(TAG, "onComplete");
}
});
手写示例代码:map函数定义
//? super 可写 |? extends 可读
public <R> Observable<R> map(Function<? super T, ? extends R> function){
// ObservableMap map = new ObservableMap(source,function);
ObservableMap<T, R> observableMap = new ObservableMap(source, function); // source 控制权
return new Observable<R>(observableMap); // observableMap是source的实现类
//return new Observable(map) ;
}
手写示例代码:ObservableMap和MapObserver定义
public class ObservableMap<T,R> implements ObservableOnSubscribe<R> {
ObservableOnSubscribe<T> source;
Function<T,R> function;
Observer<R> observableEmitter;
public ObservableMap(ObservableOnSubscribe source, Function<T,R> function) {
this.source = source;
this.function = function;
}
@Override
public void subscribe(Observer<R> observableEmitter) {
this.observableEmitter = observableEmitter;
// source.subscribe(observableEmitter); // 不应该把下一层Observer交出去 ---》 上一层, 如果交出去了,map没有控制权
MapObserver<T> mapObserver = new MapObserver(observableEmitter, source, function);
source.subscribe(mapObserver); // 把我们自己 map MapObserver 交出去了
}
class MapObserver<T> implements Observer<T>{
ObservableOnSubscribe source;
Function<T,R> function;
Observer<R> observableEmitter;
public MapObserver(Observer<R> observableEmitter, ObservableOnSubscribe source, Function<T, R> function) {
this.observableEmitter = observableEmitter;
this.function =function;
this.source=source;
}
@Override
public void onSubscribe() {
observableEmitter.onSubscribe();
}
@Override
public void onNext(T item) {
try {
R r= function.apply(item);
observableEmitter.onNext(r);
} catch (Throwable throwable) {
throwable.printStackTrace();
observableEmitter.onError(throwable);
}
}
@Override
public void onError(Throwable e) {
observableEmitter.onError(e);
}
@Override
public void onComplete() {
observableEmitter.onComplete();
}
}
}