Android 响应式编程框架 - RxJava2(二)基础使用
Android 响应式编程框架 - RxJava2(二)基础使用
RxJava可以浓缩为异步两个字,其核心的东西不外乎两个, Observables(被观察者) 和 Observable(观察者)。Observables可以发出一系列的 事件(例如网络请求、复杂计算、数据库操作、文件读取等),事件执行结束后交给Observable 的回调处理。
一、RxJava三要素
- 被观察者(Observable)
- 观察者(Observer)
- 订阅(subscribe)
二、创建一个简单的RxJava2栗子
1.添加RxJava2依赖
implementation 'io.reactivex.rxjava2:rxjava:2.0.1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
2.创建Observble(被观察者)
Observable observable = Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter e) throws Exception { e.onNext("哈哈"); e.onComplete(); } });
3.创建Observer(观察者)
Observer observer = new Observer() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String value) { Log.e("RxJava2","observer---onNext---"+value); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } };
4.关联订阅(Subscribe)
observable.subscribe(observer);
5.栗子测试结果
从测试结果可以看到一旦 Observer 订阅了 Observable,Observable 就会调用 Observer 的 onNext()、onCompleted()、onError() 等方法。至此一个完整的 RxJava 调用就完成了。
三、RxJava操作符
RxJAVA 操作符实在是太多了这里我们就不一一列举出来了,列出常用的
- interval 延时几秒,每隔几秒开始执行
- take 超过多少秒停止执行
- map 类型转换
- observeOn 在主线程运行
- doOnSubscribe 在执行的过程中
- subscribe 订阅
四、RxJAVA的线程调度器
常用的是 Schedulers.io()进行耗时操作、和AndroidSchedulers.mainThread()更新ui
调度器种类
Schedulers.immediate()
直接在当前线程运行,相当于不指定线程,默认的SchedulerSchedulers.newThread():
总是启动新线程,在新的线程中执行操作Schedulers.io()
I/O操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler,行为模式和newThread()差不多,区别在于io()的内部实现是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下,io()比newThread()更有效率。不要把计算工作放在io(),可以避免穿件不必要的线程。Schedulers.computation()
计算所使用的Scheduler。这个计算是指CPU密集型计算,即不会被I/O等操作限制性的操作,例如图形的计算。这个Sheduler使用的固定的线程池,大小为cpu核数。不要把I/O放在computation中,否则I/O操作等待时间会浪费cpu。用于计算任务,如事件循环或和回调处理,不要用于IO操作(IO操作请使用Schedulers.io());默认线程数等于处理器
的数量Schedulers.from(executor)
使用指定的Executor作为调度器。Schedulers.trampoline()
当其它排队的任务完成后,在当前线程排队开始执行AndroidSchedulers.mainThread()
在RxAndroid中,他指定操作将在Android主线程中执行。
指定线程
observerOn(Schedulers)
指定观察者Observer在哪个线程执行subscribeOn(Scheduler)
指定被观察者Observable在哪个线程执行
栗子(倒计时按钮)
private void sendCode() { //创建倒计时总数 final int count = 10; Flowable.intervalRange(0, count, 0, 1, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread())//线程切换 .doOnNext(new Consumer() { @Override public void accept(Long aLong) throws Exception { btnSendCode.setBackgroundColor(Color.GRAY); btnSendCode.setEnabled(false); btnSendCode.setTextColor(Color.WHITE); btnSendCode.setText(count - aLong + "秒后重新获取"); } }).doOnComplete(new Action() { @Override public void run() throws Exception { btnSendCode.setText("重新获取验证码"); btnSendCode.setBackgroundColor(Color.parseColor("#ff33b5e5")); btnSendCode.setTextColor(Color.WHITE); btnSendCode.setEnabled(true); } }).subscribe(); }
RxJava2 学习资料
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid
更多相关文章
- Android进阶2:线程和线程池(2)—— HandlerThread原理解析
- Android Handler ExecutorService(线程池) 缓存模式
- 开源一个友盟 for android 操作的封装包
- Android之文件操作和JUnit
- Android ADT 离线下载操作步骤
- Android测试用例执行线程和UI线程
- Android文件系统的结构及目录用途、操作方法
- 在android中利用多线程实现对控件的更新(动态修改文本框中的值)。
- 进程方法Android进程与线程基本知识