1 基础版RxJava框架
RxJava是一个非常牛逼的框架,用法很简单,但内部实现复杂,代码逻辑绕。既然用拆轮子的方式来分析源码比较难啃,我们换种方式,以造轮子的方式,将源码中与性能、兼容性、扩展性有关的代码剔除,留下核心代码带大家揭秘RxJava的实现原理。
RxJava是响应式编程–Reactive Programming在Java中的一种实现。那啥叫响应呢?你烧水呢,水烧开了,水壶会叫,这就是一下响应了。
响应式它是依赖于事件的,响应式的代码它的运行不是按代码的顺序,而是跟多个按时间发生的事件有关。依赖事件就是“回调”,但在响应式编程里,这些按时间排列的事件,被称为“流–stream”,它里面包含的是事件的时间值,这些时间值就是数据。
可以说,响应式编程就是:异步的数据流的开发。
2 使用方法
(1)在 gradle 中引入:
compile 'com.guan.codelibs:rxjava:1.0.0'
(2)example
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 基本的RxJava例子
textRxJava1();
// map操作符的作用是将T类型的Event转化成R类型
textRxJava2();
// 线程切换
textRxJava3();
}
/**
* 基本的RxJava例子
*/
public void textRxJava1() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for (int i = 0; i < 10; i++) {
subscriber.onNext(i);
}
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onNext(Integer var1) {
System.out.println(var1);
}
});
}
/**
* map操作符的作用是将T类型的Event转化成R类型
*/
private void textRxJava2() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
Log.e("tag", "create + call:" + 111);
subscriber.onNext(111);
}
}).map(new Func1<Integer, String>() {
@Override
public String call(Integer from) {
Log.e("tag", "create + Func1:" + from);
return "maping " + from;
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.e("tag", "onCompleted");
}
@Override
public void onError(Throwable t) {
Log.e("tag", "onError:" + t.toString());
}
@Override
public void onNext(String var1) {
Log.e("tag", "onNext:" + var1);
}
});
}
/**
* 线程切换
* subscribeOn()作用的是OnSubscribe
* observeOn()作用的是Subscriber
*/
private void textRxJava3() {
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
Log.e("tag", "OnSubscribe3call@ " + Thread.currentThread().getName());
subscriber.onNext(1);
}
}).map(new Func1<Integer, String>() {
@Override
public String call(Integer from) {
Log.e("tag", "OnSubscribe3Func1@ " + Thread.currentThread().getName());
return "1";
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onNext(String var1) {
Log.e("tag", "Subscriber3onNext@ " + Thread.currentThread().getName());
}
});
}
}
(3)RxJava实现异步(子线程)
public interface RxAsyncCallback<T> {
T doInBackgroud();
void onPost(T t);
}
/**
* 提醒:耗时操作放在子线程实行
*/
public class RxAsync {
public static <T> void run(final RxAsyncCallback<T> callback) {
Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
T t = callback.doInBackgroud();
subscriber.onNext(t);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<T>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(T t) {
callback.onPost(t);
}
});
}
}
3 源码地址
github项目地址:CodeLibs/lib-rxjava/
4 故事分析
杀猪佬刀坏了-->找到他的朋友通知-->打铁佬打了一把刀(钱:杀猪佬-->他的朋友-->打铁佬)
// Observable(订阅源) --> 杀猪佬
// create --> 找到
// Observable.OnSubscribe<> --> 他的朋友
// Integer --> 钱(给了朋友钱)
// subscribe --> 通知(onSubscribe.call(subscriber))
// Subscriber(观察者) --> 打铁佬
// onNext(Ivar1) --> 打了一把刀(朋友把钱转给打铁佬)
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(i);
}
}).subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onNext(Integer var1) {
System.out.println(var1);
}
});
杀猪佬刀坏了,但是它只有猪肉没钱-->找一个中介把猪肉换成钱-->找到他的朋友通知-->打铁佬打了一把刀
(猪肉:杀猪佬-->中介 = 钱;钱:杀猪佬-->他的朋友-->打铁佬)
// Observable(订阅源) --> 杀猪佬
// create --> 找到
// Observable.OnSubscribe<> --> 他的朋友
// Integer --> 猪肉
// String --> 钱
// map --> 找一个
// new Func1<Integer, String> --> 中介,把猪肉换成钱
// subscribe --> 通知(onSubscribe.call(subscriber))
// Subscriber(观察者) --> 打铁佬
// onNext(Ivar1) --> 打了一把刀(朋友把钱转给打铁佬)
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
}
}).map(new Func1<Integer, String>() {
@Override
public String call(Integer from) {
return "maping " + from;
}
}).subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onNext(String var1) {
Log.e("tag","onNext:" + var1);
}
});
5 UML图分析
5.1 基本的RxJava例子
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-基本的RxJava例子
5.2 map操作符:将T类型的Event转化成R类型
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-map操作符
5.3 线程切换
由于篇幅较大,请需要的小伙伴下载文件:RxJava框架时序图-线程切换