- 添加依赖
compile 'io.reactivex:rxjava:1.1.6'
compile 'io.reactivex:rxandroid:1.2.1'
-
Lambda表达式:
step1.在根目录下的build.gradle添加:dependencies { ... classpath 'me.tatarka:gradle-retrolambda:3.2.5' ... }
step2.在app下的build.gradle添加:
apply plugin: 'me.tatarka.retrolambda'
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
}
...
}
- 基本用法
创建被观察者Observable,oncreate或just依次调用参数
创建观察者Subscriber/observer,其中onCompleted、onError和onNext是必须要实现的方法
订阅 observable.subsribe(observer)
RxJava源码提供了一堆Action
-
RxJava 已经内置了5个 Scheduler用于切换线程
btnStart.setEnabled(false); Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(longRunningOperation()); subscriber.onCompleted(); }}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { btnStart.setEnabled(true); } @Override public void onError(Throwable e) { } @Override public void onNext(String s) { Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show(); }});
- 操作符
为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。RxJava提供了很多很有用的操作符。
create()
方法是 RxJava 最基本的创造事件序列的方法just(T...): 将传入的参数依次发送出来。
from(T[])
将传入的数组或 Iterable
拆分成具体对象后,依次发送出来。FuncX和 ActionX 的区别在 FuncX 包装的是有返回值的方法
map()操作符就是用于变换Observable对象的,map操作符返回一个Observable对象
Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber
-
Observable.flatMap()接收一个Observable的输出作为输入,同时输出另外一个Observable;理解flatMap的关键点在于,flatMap输出的新的Observable正是我们在Subscriber想要接收的
final List<String> list = new ArrayList<>(); list.add("url1"); list.add("url2"); list.add("url3"); Observable.just(list) .flatMap(new Func1<List<String>, Observable<String>>() { @Override public Observable<String> call(List<String> strings) { return Observable.from(strings); } }) .subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println(s); } });
filter()输出和输入相同的元素,并且会过滤掉那些不满足检查条件的。
take()输出最多指定数量的结果。
-
doOnNext()允许我们在每次输出一个元素之前做一些额外的事情,比如这里的保存标题。
query("Hello, world!") .flatMap(urls -> Observable.from(urls)) .flatMap(url -> getTitle(url)) .filter(title -> title != null) .take(5) .doOnNext(title -> saveTitle(title)) .subscribe(title -> System.out.println(title));
- 使用场景
- 后台线程取数据
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) - 使用debounce减少频繁的网络请求
- 使用throttleFirst防止按钮重复点击
- Retrofit结合RxJava做网络请求框架
- RxJava代替EventBus进行数据
- 使用combineLatest合并最近N个结点 注册的时候所有输入信息(邮箱、密码、电话号码等)合法才点亮注册按钮。
- 使用concat和first做缓存
- 使用timer做定时操作
- 使用interval做周期性操作
- RxAndroid
- AndroidSchedulers提供了针对Android的线程系统的调度器。在UI线程中运行某些代码只需要使用AndroidSchedulers.mainThread():
- AndroidObservable
- bindActivity()和bindFragment()方法默认使用AndroidSchedulers.mainThread()来执行观察者代码,这两个方法会在Activity或者Fragment结束的时候通知被观察者停止发出新的消息。
- AndroidObservable.fromBroadcast()方法,它允许你创建一个类似BroadcastReceiver的Observable对象
- ViewObservable可以给View添加了一些绑定。如果你想在每次点击view的时候都收到一个事件,可以使用ViewObservable.clicks(),或者你想监听TextView的内容变化,可以使用ViewObservable.text()。
关于Subject的使用
注意
- 在RxJava中,Observable可以被分为Hot bservable
与Cold Observable- 把Hot Observable比喻成一个电台,听众从某个时刻收听这个电台开始就可以听到此时播放的节目以及之后的节目,但是无法听到电台此前播放的节目
- 而Cold Observable就像音乐 CD ,人们购买 CD 的时间可能前后有差距,但是收听 CD 时都是从第一个曲目开始播放的。也就是说同一张 CD ,每个人收听到的内容都是一样的, 无论收听时间早或晚。
- Subject 属于Cold Observable
- 一定要用Subcect.create()的方式创建并使用,不要用just(T)、from(T)、create(T)创建,否则会导致失效...
分类
- AsyncSubject
- 用AsyncSubject无论输入多少参数,永远只输出最后一个参数。
- BehaviorSubject
- 发送离订阅最近的上一个值,没有上一个值的时候会发送默认值,如果遇到错误会直接中断
- PublishSubject
- 最正常的Subject,从那里订阅就从那里开始发送数据。
- ReplaySubject
- 无论何时订阅,都会将所有历史订阅内容全部发出。