版权声明:转载请注明出处。作者:两仪织,博客地址:http://blog.csdn.net/u013894427 https://blog.csdn.net/u013894427/article/details/86006934
这篇博客是学习RxAndroid过程中做的笔记,学习的博客为
优美的异步
nicolelili1的Rx相关文章
概念
- FuncX X表示参数个数
- emit 发射
- retrofit 改造
- <? extends T>表示上界通配符,表示T和它的子类
- <? super T>表示下界通配符,表示T和它的父类
响应式编程
A=B+C A经过赋值之后,如果B的值改变了,A的值会随之改变
基本的过程
- 创建被观察者(Observable)
- 创建观察者(Observer)
- 被观察者.subscribe(观察者)完成两者连接
- 被观察者用onNext给观察者传递结果
- 被观察者中调用onComplete之后,观察者和被观察者断开连接
- 被观察者调用onNext()函数的参数如果是error,观察者调用onError函数,被观察者和观察者断开连接(但是观察者依然会发送????所以不能调用多个onError())
- 观察者可以通过调用onSubscribe()中传入的对象Disposable的dispose()函数即可完成断开连接,关联断开后,被观察者依然会继续发送数据
高级用法
- Observable.just就是用来创建只发出一个事件就结束的Observable对象
- Observable.create()
- 用Action代替Observer的onComplete()
- 用Consumer代替Observer的onNext()函数
- 用Consumer代替Observer的onError()
- 用Consumer代替Observer的onSubscribe(),
- 所以被观察者的subscribe()就会有多个重载的方法
举例
Observable<String> observable = Observable.just("hello");
Action onCompleteAction = new Action() {
@Override
public void run() throws Exception {
Log.i("kaelpu", "complete");
}
};
Consumer<String> onNextConsumer = new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.i("kaelpu", s);
}
};
Consumer<Throwable> onErrorConsumer = new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("kaelpu", "error");
}
};
observable.subscribe(onNextConsumer, onErrorConsumer, onCompleteAction);
线程调度
- 观察者和被观察者都是工作在同一个线程中的
- 被观察者在调用subscribe()函数之前可以调用subscribeOn()来指定被观察者运行的线程,多次调用只有第一次调用有效果
- 被观察者在调用subscribe()函数之前可以调用observeOn()来指定观察者运行的线程,调用依次可以切换一次运行线程
- Schedulers.newThread()是RxAndroid中设计的新线程
- Schedulers.io()是RxAndroid提供的IO线程池中的一个
- Schedulers.immediate(): 默认指定的线程,也就是当前线程;
- Schedulers.computation():计算所使用的调度器。这个计算指的是 CPU 密集型计算,即不会被 I/O等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。值得注意的是,不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU
- AndroidSchedulers.mainThread()表示的是UI主线程
- create(),just(),from() — 事件产生 运行在被观察者线程中
- map(),flapMap(),scan(),filter()等-- 事件加工 运行在观察者线程中
- subscribe()-- 事件消费运行在观察者线程中
举例
Observable.just(getDrawableFromNet("http://www.baidu.com/icon.png"))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Drawable>() {
@Override
public void accept(Drawable drawable) throws Exception {
((ImageView)findViewById(R.id.imageView)).setImageDrawable(drawable);
}
});
private Drawable getDrawableFromUrl(String url){
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return getResources().getDrawable(R.drawable.baidu);
}
操作符的使用
- 大部分操作符都是静态函数,直接可以通过Observable来调用
- create(new ObservableOnSubscribe)作用是新建一个被观察者实例
- merge(observable1,observable2)作用是多个被观察者序列合成一个序列,方便观察者管理
- from()在RxAndroid2.x中被分解成了三个函数
- fromArray(),fromIterable(),fromFuture()
- 接收一个集合作为输入,然后每次输出一个元素给subscriber
- map(Function<From from,To to>)作用是把原始发送的数据进行一定的转换,传入的Function类,返回值的类型就是To
- flatmap(From from,To to)作用是把被观察者中传递的单个对象,拆分成多个创建新的被观察者,然后单独发送给观察者,返回值当然是Observable类型的,但是里面传递的call函数的返回值可以不是呀
- zip(Observable1,Observable2,new BiFunction)
- 是Observable类的静态函数
- 只会运行项目最少(onNext()函数调用最少)的那个被观察者的onNext()函数,其他函数不受影响
- filter()条件过滤,去除某些不符合条件的事件
- take()最多保留的事件数
- range(int start,int num )仅仅用于Integer之类的,start表示起始值,num表示要发送的事件的个数,如果是0,则不会发送,如果是负数,则会报错
- interval()传入一个表示时间间隔的参数和一个表示时间单位的参数。onNext()接收到的参数会是从0开始到无限大的数据,这样的话,占位符T就表示long。作用感觉和repeatWhen类似
- doOnNext(Consumer)在执行下一个事件之前需要做的事情
- repeat() 不是静态的,需要具体的实例来调用,是在触发到onComplete之后才调用的
- 如果不传入参数,那么会一直发射
- 如果传入参数为数字,那么会重复有限次数
- repeatWhen(new Func1()) 表示有条件的重复发送事件,比如定时发送
- retry() 不是静态的,需要具体的实例来调用,是在触发到onError之后调用的
针对Android的扩展
- AndroidSchedulers.mainThread():表示Android的主线程
- AndroidObservable提供了很多方法来配合Android 的生命周期
- bindActivity()和bindFragment()默认使用主线程执行观察者的代码
- fromBroadcast()创建一个类似BroadcastReceiver的被观察者对象
- ViewObservable可以给View添加一些绑定
- clicks()每次点击view的时候都可以收到一个事件
- text() 监听textview内容的变化
RxAndroid的一些应用场景
- 界面需要等到多个并发接口取完数据再更新,
- 界面按钮需要防止连续点击
- 响应式页面,比如勾选了某一个checkbox,自动更新Preference