RxJava操作符学习备忘
来源:互联网 发布:扫描识别文字软件 编辑:程序博客网 时间:2024/05/18 01:58
操作符学习
- create:最基本的创建Observable方法,ObservableEmitter用于发送事件并且可以可以上下游的订阅关系是否被切断
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { if (!e.isDisposed()) { e.onNext(1); e.onNext(2); e.onNext(3); e.onComplete(); } } })
2.just:创建一个依次发送事件的Observable对象的
3.Map:用于包装转换事件
observable.map(new Function<Integer, String>() { @Override public String apply(Integer integer) throws Exception { Log.i(TAG, "apply Thread:" + Thread.currentThread().getName()); return "soilder" + integer; } })
4.FlatMap:用于将事件拆分成多个事件进行发送,但是不能确保事件的先后顺序
observable. .flatMap(new Function<Integer, ObservableSource<String>>() { @Override public ObservableSource<String> apply(Integer integer) throws Exception { Log.i(TAG, "apply Thread:" + Thread.currentThread().getName()); ArrayList<String> arrayList = new ArrayList<String>(); for (int i = 0; i < 3; i++) { String s = "to be Number" + integer; arrayList.add(s); } return Observable.fromIterable(arrayList).delay(1000, TimeUnit.MILLISECONDS);//通过延时就可以发现是无序的 } })
5.concatMap类似与flatMap,但是确保事件的发送是严格有序的
6.switchMap也与concatMap类似,一样是保证事件的顺序的,不同是如果数据源Observable产生A、B、C三个结果,通过switchMap的自定义映射规则,映射后应该会产生A1、A2、B1、B2、C1、C2,但是在产生B2的同时,C1已经产生了,这样最后的结果就变成A1、A2、B1、C1、C2,B2被舍弃掉了
7.zip组合事件将两个事件源组合成一个事件源
Observable<Integer> observable1 = Observable.range(1, 3).subscribeOn(Schedulers.io()); Observable<String> observable2 = Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> e) throws Exception { debugLog("subscribe Thread:" + Thread.currentThread()); e.onNext("Student"); e.onNext("Student"); e.onNext("Student"); e.onNext("Student"); e.onComplete(); } }).subscribeOn(Schedulers.newThread()); Observable.zip(observable1, observable2, new BiFunction<Integer, String, String>() { @Override public String apply(Integer integer, String s) throws Exception { return s + integer; } })
8.buffer(int size,int skip),设置长度为start的缓冲区,每次跳过skip个
Observable.just("one", "two", "three", "four", "five").buffer(3, 2).subscribe(new Observer<List<String>>() { @Override public void onSubscribe(Disposable d) { Log.d(TAG, " onSubscribe : " + d.isDisposed()); } @Override public void onNext(List<String> stringList) { debugLog(" onNext size : " + stringList.size()); Log.d(TAG, " onNext : size :" + stringList.size()); for (String value : stringList) { debugLog(" value : " + value); } } @Override public void onError(Throwable e) { debugLog(" onError : " + e.getMessage()); } @Override public void onComplete() { debugLog(" onComplete"); } }); //打印的结果为"one", "two", "three" //"three", "four", "five" //"five"
9.Completable观察者类,只能发送完成事件的观察者
Completable.create(new CompletableOnSubscribe() { @Override public void subscribe(CompletableEmitter e) throws Exception { e.onComplete(); } }).subscribe(new CompletableObserver() { @Override public void onSubscribe(Disposable d) { debugLog(" onSubscribe "); } @Override public void onComplete() { debugLog(" onComplete "); } @Override public void onError(Throwable e) { debugLog(" onError "); } });
10.filter过滤,用于筛选调不需要的事件
11.debounce每产生一个结果后一定事件段内没产生新的事件就把事件交给下游处理,如果有新的事件那就把新的事件交给下游处理.计时起点会重置为被发送的事件的起点.(这个方法记时起点都是事件的发送的时间点)
,操作即时搜索框的时候非常使用
Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { // send events with simulated time wait e.onNext(1); // skip Thread.sleep(400); e.onNext(2); // deliver Thread.sleep(505); e.onNext(3); // skip Thread.sleep(100); e.onNext(4); // deliver Thread.sleep(605); e.onNext(5); // deliver Thread.sleep(510); e.onComplete(); } }).debounce(500, TimeUnit.MILLISECONDS) .observeOn(Schedulers.io()) .subscribeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { debugLog(" onSubscribe "); } @Override public void onNext(Integer value) { debugLog(" onNext "); debugLog(" value: " + value); } @Override public void onError(Throwable e) { debugLog(" onError "); } @Override public void onComplete() { debugLog(" onComplete "); } });
12.defer操作符其实效果与create操作符相同,当然create方法你需要手动发送onComplete事件,defer不同于just,from等操作符在创建被观察者对象的时候就已经存储了事件对象,他在发送时候事件的内容才确定事件的内容因此可以获取到最新的事件对象,对于对象类型的事件来说just与defer效果是一样的这设计java深拷贝浅拷贝的问题
13.CompositeDisposable与subscribeWith.subscribeWith用于返回Disposable对象,CompositeDisposable用于存储Disposable对象,CompositeDisposable对象通过调用clear方法切断所有被观察者和观察者之间的联系.
14.distinct方法用于去除重复的事件
15.reduce方法用于累加累减去累乘等功能
16.类似与计时器的功能interval(long initialDelay, long period, TimeUnit unit)
17.last(T t)当上游没发送事件的时候发送一个默认的事件
18.merge把两个数据源头整合成一个数据源,不改变事件发送的先后顺序
19.lift()操作符,高阶的底层的一个操作符,当现有的操作符满足不了需求时候就可以尝试使用lift,里面使用的代理模式实现,但一般不建议使用,容易发生意料不到的错误.一般尽量使用常用的操作符号
20.compose用于转换Observable的方法,当对一组的Observable的进行一连串flat,Map的变换的的时候就需要使用Compose;
Observable observable1=Observable.just(1,2,3).map(integer -> integer+"A") .delay(100,TimeUnit.MILLISECONDS) .filter(s -> s.contains("1"));Observable observable2=Observable.just(9,12,14).map(integer -> integer+"A") .delay(100,TimeUnit.MILLISECONDS) .filter(s -> s.contains("1"));Observable observable3=Observable.just(8,5,14).map(integer -> integer+"A") .delay(100,TimeUnit.MILLISECONDS) .filter(s -> s.contains("1"));.......
当然可以写成这样:
public void PretreatmentObservable(Observable<Integer> ob){ ob.map(integer -> integer+"A") .delay(100,TimeUnit.MILLISECONDS) .filter(s -> s.contains("1"));; }PretreatmentObservable(Observable.just(1,2,3))PretreatmentObservable(Observable.just(9,12,14))PretreatmentObservable(Observable.just(8,5,14)) .......
为了保持链式操作可以使用compose()
ObservableTransformer<Integer,String> transform=new ObservableTransformer<Integer, String>(){ @Override public ObservableSource apply(Observable<Integer> upstream) { return upstream.map(new Function<Integer,String>() { @Override public String apply(Integer i ) throws Exception { return i+"A"; } }).filter(new Predicate<String>() { @Override public boolean test(String s) throws Exception { return s.contains("1"); } }).delay(100,TimeUnit.MILLISECONDS); }}; Observable.just(1,2,3).compose(transform); Observable.just(9,12,14).compose(transform); Observable.just((8,5,14).compose(transform);.......
- RxJava操作符学习备忘
- RxJava操作符学习
- RxJava学习--操作符
- RxJava学习备忘
- RxJava-操作符 初步学习
- Rxjava操作符学习博客
- RxJava操作符学习APP
- RxJava--操作符学习笔记
- RxJava操作符学习APP
- Rxjava学习(二操作符)
- RxJava操作符学习笔记
- Android学习笔记-RxJava备忘
- RxJava&&RxAndroid学习地址备忘
- RxJava入门学习------①操作符
- RxJava学习资料及操作符总览
- RxJava学习笔记(二)--- 操作符
- [RxJava学习]操作符Map源码分析
- [RxJava学习]操作符flatMap源码分析
- 解决Android单个dex文件不能超过65535个方法问题
- linux下载文件的常用命令wget
- Java使用HttpClient4.3发送GET/POST请求
- Trafodion 使用transpose生成1~1000序列
- The method getSupportFragmentManager() is undefined for the type MessageActivity
- RxJava操作符学习备忘
- ISCC2017部分题目wp
- Emailcamel.com
- Android Studio一直Building的解决
- spark 2.1 ResultTask run process
- UML学习一
- uC/OS-III之资源管理
- Python中字典(dict)详解
- 前端JSZIP库的使用