RxJava是基于观察者模式实现的。
RxJava 在 GitHub 主页上的自我介绍是 "a library for composing asynchronous and event-based PRograms using observable sequences for theJavaVM"(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。RxJava本质上是实现异步操作的库。
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask
和Handler
,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
在开始之前,先学习一下RxJava的主要属性和方法:
Observable:(可观察者,即被观察者),在需要时发出事件
Observer:(观察者),观察者处理事件
Subscribe:(订阅)事件,Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Observer
subscribeOn(AndroidSchedulers.io()):事件发生在io线程,即Observable.onSubscribe被激活时所处的线程(事件产生线程)
observeOn(AndroidSchedulers.mainThread()):事件处理在子线程中,(事件消费线程)
RxJava采用『后台线程取数据,主线程显示』的程序策略
compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.0'
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) {
//可在此方法中执行耗时操作,请求网络等
subscriber.onNext("努力"); subscriber.onNext("拼搏"); subscriber.onNext("乐观"); subscriber.onNext("负责"); subscriber.onNext("担当"); } });
observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());
/** * 在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作, * 例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空 * 不可指定线程,在Subscriber所发生的线程中调用 * 要在指定的线程来做准备工作,可以使用 doOnSubscribe() 方法*/
Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { //事件完成时调用执行 } @Override public void onError(Throwable e) { //事件出错时调用执行 } @Override public void onNext(String s) { Log.e("schedulerSubscriber", "onNext: " + s ); //事件消费时调用执行 } };
observable.subscribe(subscriber);
第一种:Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(" "); ....
} });
第二种:Observable.just( , , , );
第三种:Observable.from( );(括号中是数组)
Observable.subscribe(new Action1( Object obj){
.....
});
Action0 是 RxJava 的一个接口,它只有一个方法 call(),这个方法是无参无返回值的
Action1 也是一个接口,它同样只有一个方法 call(T param),这个方法也无返回值,但有一个参数
Observable持有Context时会导致内存泄漏(创建Subscription时,会以某种方式持有了Context的引用,如果没有及时的结束,内存占用会越来越大)
解决方法:在生命周期的某个时刻及时的取消订阅(使用CompositeSubscription来持有所有的subscriptions,然后在onDestory()或onDestoryView()里取消所有的订阅)
持有:compositeSubscription.add(subscription);
取消:compositeSubscription.unsubscribe();
新闻热点
疑难解答