RxJava基本用法
来源:互联网 发布:不可而知 编辑:程序博客网 时间:2024/06/05 09:24
说到异步操作,通常Android会使用Handler和AsyncTask,但是随着请求的数量越来越多,逻辑越来越复杂,RxJava依然能保持比较清晰的逻辑。RxJava就是创建一个Observable对象,通过各种操作符把想要处理的数据加工成想要的成品,然后发射给Subscriber。
使用前在Android Studio配置gradle
compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.2.0'
1.创建观察者
//创建观察者处理Observable对象发出的字符串 Subscriber subscriber = new Subscriber<String>() { @Override public void onStart() { Log.d("TAG","onStart"); } @Override public void onCompleted() { Log.d("TAG","onCompleted"); } @Override public void onError(Throwable e) { Log.d("Tag","onError"); } @Override public void onNext(String s) { Log.d("TAG","onNext"+s); } };
onStart:在事件还未发送前调用,可用于准备工作,如数据的重置或者重置,它是一个可选方法,默认实现为空。需要注意的是如果对工作的线程有要求,比如:弹出一个AlertDialog、ProgressBar等必须在主线程运行的任务,就不能用onStart()方法,因为它总是在subscribe方法所发生的线程中调用,而不能指定线程,要在指定的线程来做准备工作,可以使用 Observable的doOnSubscribe() 方法完成初始化。
onCompleted:事件队列完结,RxJava不仅把每个事件单独处理,其还会把他们看作一个队列,当没有新的onNext发出时,需要触发onCompleted方法作为完成的标志。
onError:事件队列异常。在事件处理过程中出现异常时,onError()方法会被触发,同时队列会被自动终止,不允许在有事件发出。
onNext : 普通事件,将要处理的事件添加到事件队列中
2.创建被观察者
//创建被观察者,它决定什么时候触发事件以及触发怎么样的事件 rx.Observable observable = rx.Observable.create(new rx.Observable.OnSub scribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onStart(); subscriber.onNext("AAAAA"); subscriber.onNext("BBBBB"); subscriber.onCompleted(); } });
如上所示通过不断地调用subscriber方法,不断的将事件添加到任务队列中。也可以使用just方法实现:
Observable observable = Observable.just("AAAA","BBBB","CCCC");
上述代码会依次调用onNext(“AAAA”)、onNext(“BBBB”)、onNext(“CCCC”)、onCompleted(),当然也可以用from方法来实现:
String[] words = {"aaaa","bbbb","cccc"};Observable observable = Observable.from(words);ArrayList list = new ArrayList(); list.add("aaaa"); list.add("bbbb"); list.add("cccc");Observable observable = Observable.from(list);
订阅只需要一行代码就可以了
observable.subscribe(subscriber);
订阅过程:
public final Subscription subscribe(Subscriber<? super T> subscriber) { return Observable.subscribe(subscriber, this);}static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {... subscriber.onStart(); if (!(subscriber instanceof SafeSubscriber)) { subscriber = new SafeSubscriber<T>(subscriber); } try { RxJavaHooks.onObservableStart(observable, observable.onSubscribe). call(subscriber); return RxJavaHooks.onObservableReturn(subscriber); } catch (Throwable e) {... return Subscriptions.unsubscribed(); }}public static <T> Observable.OnSubscribe<T> onObservableStart(Observable<T> instance, Observable.OnSubscribe<T> onSubscribe) { Func2<Observable, Observable.OnSubscribe, Observable.OnSubscribe> f = onObservableStart; if (f != null) { return f.call(instance, onSubscribe); } return onSubscribe;}public static Subscription onObservableReturn(Subscription subscription) { Func1<Subscription, Subscription> f = onObservableReturn; if (f != null) { return f.call(subscription); } return subscription;}
1.首先调用Subscriber.onStart()
2.调用RxJavaHooks.onObservableStart(observable, observable.onSubscribe)方法返回一个onSubscribe,然后调用onSubscribe的call方法,在这里,事件发送的逻辑开始运行。
3.调用RxJavaHooks.onObservableReturn(subscriber);即将传入的Subscriber 作为 Subscription 返回
不完整回调:
除了 subscribe(Observer) 和 subscribe(Subscriber) ,subscribe() 还支持不完整定义的回调
Action1<String> onNextAction1 = new Action1<String>() { @Override public void call(String s) { Log.d("TAG","onNext"+s); } }; Action1<Throwable> onErrorAction1 = new Action1<Throwable>() { @Override public void call(Throwable throwable) { Log.d("TAG","onError"); } }; Action0 onCompletedAction = new Action0() { @Override public void call() { Log.d("TAG","onCompleted"); } };observable.subscribe(onNextAction1,onErrorAction1,onCompletedAction);Observable.from(list).subscribe(onNextAction1);
定义了onNextAction1处理onNext的回调,onErrorAction1处理onError的回调,onCompletedAction处理onCompleted的回调,然后把他们传递给subscribe方法,如下:
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("AAAAAA"); }}).subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("TAG","onNext:"+s); } });
线程控制:
Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 SchedulerSchedulers.newThread(): 总是启用新线程,并在新线程执行操作Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread() 差不多,区别在于 io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 比 newThread() 更有效率。不要把计算工作放在 io() 中,可以避免创建不必要的线程。Schedulers.computation(): 计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。另外, Android 还有一个专用的 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
在RxJava中使用subscribeOn和observeOn操作符控制线程;subscribeOn用于指定Observable自身在哪个线程上运行,如果Observable需要执行耗时操作,一般可以让其在新开的子线程运行,observeOn用来指定Observer所运行的线程,也就是发射出的数据在哪个线程上使用,一般情况会指定在主线程中运行,这样就可以修改UI:
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { Log.d("TAG",Thread.currentThread().getName()); subscriber.onNext("AAAAAA"); }}).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("TAG",Thread.currentThread().getName()); Log.d("TAG","onNext:"+s); } });
subscribeOn(Schedulers.io())表示Observable运行在新开的线程,observeOn(AndroidSchedulers.mainThread())表示subscriber 数字的打印将发生在主线程。
- Rxjava基本用法
- Rxjava基本用法总结
- RxJava的基本用法
- RxJava基本用法
- rxjava第一篇 rxjava基本用法
- Android Rxjava的create的基本用法
- Rxjava的原理以及基本用法
- Rxjava用法
- Adnroid RxJava的使用(一)基本用法
- 【Android】RxJava的使用(一)基本用法
- Android Retrofit+rxjava+okhttp请求网络的基本用法
- Android Rxjava的from方法的基本用法
- Android函数响应式编程最新RxJava-基本用法(1)
- Android之RxJava函数响应式编程(一)基本用法
- 【Android】RxJava的使用(一)基本用法
- 【RxJava】Observable基本方法
- RxJava的基本使用
- RxJava的基本流程
- Spring Boot (三) 热部署
- java上传文件实例
- mybatis的xml中使用foreach
- ReactNative知识体系
- ${pageContext.request.contextPath} jsp中获取绝对路径
- RxJava基本用法
- laravel Excel
- int , long , long long 的数据范围
- ElasticSearch学习笔记(二)IK分词器和拼音分词器的安装
- JSP需要掌握的内容
- 发布自己的npm包及报错解决办法
- 程序员不能只会敲代码还要会投资理财
- Android_ADB
- two point