Android开源项目原理系列
干巴巴地看源码,理解得很模糊,亲自写一遍才知道真正掌握并不容易。折腾一天,模拟实现了RxJava最简单的入门例子,代码在这里,很水的。
发射一个数据,使用操作符map变换,产生数据运行在一个线程,消费数据运行在另一个线程。
Observable observable = Observable.just(10)
.map(integer -> {
System.out.println("[Operation] map at " + Thread.currentThread().getName());
return String.valueOf(integer * integer);
}).subscribeOn(new NewThreadScheduler("subscribeOnThread"))
.observeOn(new NewThreadScheduler("observeOnThread"));
Observer observer = new Observer() {
@Override
public void onSubscribe(Disposable disposable) {
System.out.println("[onSubscribe] at " + Thread.currentThread().getName() + " upstream[" + disposable.getClass().getSimpleName() + "]");
}
@Override
public void onNext(String value) {
System.out.println("[onNext] value [" + value + "] at " + Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
System.out.println("[onError] -> " + e.getMessage());
}
@Override
public void onComplete() {
System.out.println("[onComplete] at " + Thread.currentThread().getName());
}
};
observable.subscribe(observer);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
运行结果很明确,just和map操作运行在subscribeOnThread,onNext和onComplete运行在observeOnThread。
[Operation] just at subscribeOnThread-1
[Operation] map at subscribeOnThread-1
[onNext] value [100] at observeOnThread-1
[onComplete] at observeOnThread-1
在模仿RxJava的过程中,不过多考虑代码扩展和并发问题,不一定和RxJava源码对象一一对应,在保持思想一致的基础上,分析最核心的骨骼。
1、Observer
Observer是观察者,定义为一个接口,提供的函数是熟悉的onSubscribe、onNext、onError、onComplete。
public interface Observer {
void onSubscribe(Disposable disposable);
void onNext(T t);
void onError(Throwable e);
void onComplete();
}
订阅后,触发onSubscribe,得到Disposable(我叫它可中止对象)。
public interface Disposable {
void dispose();
boolean isDisposed();
}
RxJava在链式执行和线程调度时,可以随时调用disposable.dispose()中止执行,因此内部很多对象需要实现Disposable接口。
2、Observable
public abstract class Observable {
public final void subscribe(Observer super T> observer) {
subscribeActual(observer);
}
abstract void subscribeActual(Observer super T> observer);
public static Observable just(T value) {
return new ObservableJust(value);
}
}
Observable是被观察者,被Observer这个观察者订阅,最核心的订阅函数subscribe理论应该定义在Observer,但为了保持链式结构,现在定义在Observable。这里subscribe简单地调用subscribeActual,subscribeActual作为抽