RxJava学习笔记(一)

时间:2022-09-29 19:38:28

*** 学习参考博客: https://asce1885.gitbooks.io/android-rd-senior-advanced/content/che_di_le_jie_rxjava_ff08_yi_ff09_ji_chu_zhi_shi.html ***
1、在gradle中添加,加载RxJava框架: compile 'io.reactivex:rxjava:1.1.2'
2、RxJava中主要涉及两个类: 被观察者类(可观察):Observable<T> 订阅者(事件)类:Observer<T>、Subscriber<T>(或者使用Action1)
3、使用说明: 观察者对象通过订阅订阅者对象来触发订阅者的回调事件。
4、被观察者初始化方式:
被观察者有多种初始化方式,一种是直接覆写call方法,在call方法里调用订阅对象的三个函数 (onNext、onComplete、onError),并将回调函数中需要的值对象直接赋值传递,如:
法一: Observable<TestBean> mObservable2 = Observable.create( new Observable.OnSubscribe<TestBean>() { /** * @param subscriber 订阅者 */ @Override public void call(Subscriber<? super TestBean> subscriber) { //根据call里的next、complete、error调用的顺序调用,但调用顺序有讲究 //在若先调用error,则next和complete两者都不调用,若complete调用在next之前,则next不调用 //若call中任何都不调用,则三个函数都不执行 subscriber.onNext(bean1); subscriber.onCompleted(); subscriber.onError(new AndroidException()); } });
法二: //此种方式,由RxJava框架调用依次调用next、complete、error, //若正常调用complete,则error不再执行。 Observable<TestBean> mObservable1 = Observable.just(bean1, bean2, bean3, bean4);
法三: //调用from的方法本质和just一致,都是依次发送,只是传入的形参不同 TestBean[] list = { new TestBean(), new TestBean(), new TestBean(), new TestBean() }; Observable<TestBean> mBeanObservable = Observable.from(list);
5、订阅者三种实现方式: 法一: 直接创建订阅类的对象,需要覆写三个函数,分别对应订阅时、订阅完成成功、订阅完成失败,相比法三,多了一个onStart方法,这个方法将在onNext执行前调用,做一些准备工作,比如初始化onNext中需要的对象或数据 /** * 订阅者对象,执行的动作 */ Subscriber<TestBean> mSubscriber = new Subscriber<TestBean>() { @Override public void onStart() { //在事件发送前(调用onNext方法前调用) Log.i("Subscriber 订阅者", "onStart()"); }
@Override public void onCompleted() { Log.i("Subscriber 订阅者", "onCompleted()"); }
@Override public void onError(Throwable e) { Log.i("Subscriber 订阅者", "onError(Throwable e)"); }
@Override public void onNext(TestBean testBean) { Log.i("Subscriber 订阅者", "onNext(TestBean testBean),testBean的值为:" + testBean.i); } };
法二: 不关注订阅操作结果onComplete和onError这两个回调,可以直接使用Action1(Action0, Action2等,Action后面接的数字代表了call方法中参数的个数,参数的类型可以在定义时指定)来创建订阅对象: /** * 当Subscriber订阅者对象不关注complete和error两种情况时 * 可以采用Action1来取代Subscriber对象执行回调 * Action1是RxJava框架中的一个抽象类 * 调用如: * mObservable1.subscribe(onNextAction); */ Action1<TestBean> onNextAction = new Action1<TestBean>() { @Override public void call(TestBean s) { Log.i("使用Action1调用:", "call(TestBean s)"); } };
法三: 这个方法的本质其实也是法一的用法,框架会将Observer包装成Subscribe对象 /** * 观察者 */ Observer<TestBean> mObserver = new Observer<TestBean>() { @Override public void onCompleted() { }
@Override public void onError(Throwable e) { }
@Override public void onNext(TestBean testBean) { } };
6、被观察者通知订阅者并触发事件 mObservable1.subscribe(mSubscriber); mObservable2.subscribe(onNextAction); 注意:被观察者和订阅者在创建时指定的泛型对象必须一致,否则编译时不会通过的。 (此处省掉Observable和Subscribe的实例化操作,看官自行实例化)
* 订阅事件,通知触发订阅事件: Observable<TestBean> mObservable1; Subscriber<TestBean> mSubscriber1; mObservable1.subscribe(mSubscriber1);
Observable<String> mObservable2; Subscriber<String> mSubscriber2; mObservable2.subscribe(mSubscriber2);
* 取消订阅: 在取消订阅前,可以先调用mSubscriber1.isUnsubscribe();判断是否有订阅 mSubscriber1.unsubscribe(); mSubscriber2.unsubscribe(); 取消订阅后不再接受监听者发来的事件,并能避免由于Observable对象持有subscribe对象导致的内存泄露。
7、使用不同方式创建Observable对象和不同的订阅者不同的调用过程: 被观察者的subscribe方法绑定订阅者会触发订阅者的事件 但要分情况说明: * 观察者的构建的不同: 1)Observable.create方法构造的Observable对象:先触发自身覆写的call函数,再根据subscriber对象方法的调用去调用订阅者的方法 RxJava学习笔记(一) RxJava学习笔记(一)

2)Observable.just方法构造的Observable对象:由框架直接调用订阅者实现的方法,依次调用onNext、onComplete(onNext执行成功)或onError(onNext执行失败) RxJava学习笔记(一) RxJava学习笔记(一)

* 订阅者的不同: 1)Subscriber<TestBean>对象实例: RxJava学习笔记(一) RxJava学习笔记(一)

2)Action1对象实例:不关注onComplete和onError的情况,call方法只对应onNext方法。 RxJava学习笔记(一) RxJava学习笔记(一)RxJava学习笔记(一)

*Observable.create方法构造的Observable对象: RxJava学习笔记(一) RxJava学习笔记(一)

* Observable.just方法构造的Observable对象: RxJava学习笔记(一) RxJava学习笔记(一)