RxJava2.0 从入门到放弃?
序
我从2016年初的时候听说RxJava,百度搜了一下是什么鬼,有人说搞安卓的2015年没学这个的算是白混了,好吧我的确是白混了,一直计划着要学习如何装逼使用RxJava,然而作为一个懒癌患者,拖到了RxJava2.0出现,纳尼,我特么还没开始学习1.0呢,这就整出了2.0,又落后了。时不我待,重新计划了一次,然并卵。2017年真的不能再拖了,于是决心真的开始搞了,不知道会不会烂尾。(欢迎各大神加群586027808指导批评教育)
-
RxJava是什么?(并不是专业回答,我只是吹水)
度娘了一番,是什么,那就是 异步异步异步,简洁简洁简洁
响应式编程
可观测的数据事件流
开始
开始之前,附上官方github地址:
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
gradle引入依赖:
compile ‘io.reactivex.rxjava2:rxjava:2.0.6’
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
其实RxJava1.0和2.0是有点区别的,具体什么区别,后续可能会说到,因为我并不会1.0,直接学习2.0,就不在乎什么鬼了,踩到坑再补。
基础
RxJava的几个东西
Observable
Observer
Flowable
Subscriber
饭一口一口吃,先说Observable(被观察者) 和Observer(观察者)
Observable“生产”实体,Observer“消费”实体。
//创建Observable 基本用法1,通过create直接创建
Observable<String> observable=Observable.create(new ObservableOnSubscribe<String>() {
//这是一个自定义的数据发射器
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//每一次调用,都会使observer响应
e.onNext("1");
e.onNext("2");
e.onNext("3");
//onComplete 会使observe回调对应的方法,同理onError
e.onComplete();
//在上一行执行了onComplete ,数据依旧会继续发射,但是observe不会进行任何响应
e.onNext("4");
//这里单独说,再一次订阅中,onError和onComplete可以都没有,但是不能都有,是互斥的
//onComplete可以写多次,并不会报错,但从第一次之后发射出去的数据observe都不会响应
//但是onError不能写多次,会在发射过程中直接抛异常
//e.onError(null);
//e.onComplete();
}
});
//基本用法2 直接发射一组定义好的数据源
//observable=Observable.just("1","2","3","4","5");
ArrayList<String> arrayList=new ArrayList<>();
arrayList.add("1");
arrayList.add("2");
arrayList.add("3");
arrayList.add("4");
//基本用法2 直接发射
//observable=Observable.fromIterable(arrayList);
//创建Observer 用于消费数据
Observer<String> observer=new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
//在接收数据前会执行,Disposable 可用于停止接收数据,但停止接收数据只是让observe不处理
//observable依旧会继续发射数据
}
//每一次ObservableEmitter 发射数据时,onNext都会回调,直到onComplete或者onError后
@Override
public void onNext(String s) {
Log.i("msg",s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
Log.i("msg","onComplete");
}
};
//建立订阅关系 只有开始订阅后,observable才会开始发射数据,subscribe有多个重载方法,可以无参纯发射
observable.subscribe(observer);
上面的代码没有任何实际意义,主要是让大家初步理解工作机制,后面再逐步学习操作符,背压,线程调度等
再使用Flowable和Subscriber来个链式装逼写法
//与1.0不同 Flowable是支持背压(这是什么鬼,后面再说,简单来讲就是处理"生产者"产能过剩的问题)
Flowable.just(1,2,3,4)//注意这是4个普通的int值
.subscribe(new Subscriber<Integer>() {
Subscription sub;
//在订阅开始后会先执行这个方法
@Override
public void onSubscribe(Subscription s) {
Log.i("msg","onSubscribe start");
//sub=s;
/**这里要注意,此处的意义是告知Flowable我要多少个数据,如果不写,onNext是不会有
回调的,直到数据发送结束,可以一次性在这说明要多少,也可以只要一个,剩下的可以在
onNext中进行申请,如果申请的数量小于总数,是不会触发最后的onComplete方法的
本例中要触发onComplete,这里就必须要大于等于4
*/
s.request(1);
Log.i("msg","onSubscribe end");
}
@Override
public void onNext(Integer integer) {
Log.i("msg","onNext "+integer.toString());
//sub.request(1); //可以在此处再次请求释放数据
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
Log.i("msg","onComplete");
}
});
以上这些….
其实我想盗图来说明点问题的,但是略麻烦,等说明操作符差异的时候再用图解
临时收工 未完待续