【Android】写给小白的RxJava教程(三)

阅读: 评论:0

【Android】写给小白的RxJava教程(三)

【Android】写给小白的RxJava教程(三)

简介:大三学生党一枚!主攻Android开发,乐于交友一起学习!
个人语录取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。

RxJava教程(三)

  • 一.RxJava中的创建操作符
      • 1.1 create
      • 1.2 just
      • 1.3 interval
      • 1.4 range
      • 1.5 timer
  • 二.RxJava中的变换操作符
      • 2.1 map
      • 2.2 flatMap
      • 2.3 concatMap
      • 2.4 flatMapIterable
      • 2.5 buffer
  • 三.总结

一.RxJava中的创建操作符

什么是创建操作符?简而言之,就是会返回一个Observable对象,并且经过该方法的特殊处理。

1.1 create

普通的创建一个Observable对象

ate(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter e) throws Exception {e.onNext(1);Log.d("create", "subscribe: "+1);e.onNext(2);Log.d("create", "subscribe: "+2);e.onNext(3);Log.d("create", "subscribe: "+3);}}).subscribe(new Observer<Integer>() {Disposable d;@Overridepublic void onSubscribe(Disposable d) {this.d=d;}@Overridepublic void onNext(Integer integer) {Log.d("create", "onNext: "+integer);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});


如果没有要求,就使用create方法创建Observable对象。

1.2 just

使用just创建,可以传入任意类型的对象列表,并会依次传递给观察者,适合只有onNext事件的被观察者。

 private void LogByJust(){Observable.just("张三","李四").subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(String s) {Log.d("just", "onNext: "+s);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

1.3 interval

该方法用于周期性的执行某个方法,传入一个间隔周期,并指定单位,可以是秒,分钟,小时和天。

 private void LogByInterval(){Observable.interval(3, TimeUnit.SECONDS).subscribe(new Observer<Long>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Long aLong) {Log.d("interval", "onNext: "+aLong);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}


此方法不依赖当前的Activity,即使活动被销毁,他仍会执行周期性的任务,如果是更新UI操作,当退出当前Activity时,会自动停止,也不会抛出异常!

1.4 range

range可以指定一个开始和count,比如说从1开始,数目为10

private void LogByRange(){Observable.range(1, 10).subscribe(new Observer<Integer>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Integer integer) {Log.d("range", "onNext: "+integer);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}


我感觉这个功能和for循环差不多哈哈哈

1.5 timer

倒计时,传入一个时间,前面是数值,后面是单位。延迟这么久以后执行任务。

private void LogByTimer() {Observable.timer(5, TimeUnit.SECONDS).subscribe(new Observer<Long>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Long aLong) {Log.d(TAG, "onNext: "+aLong);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

常用的创建操作符就以上。Retrofit2.0和之前的版本差别挺大的!!!
个人感觉RxJava中的操作符就和Python中的方法一样,要是完全写出来,都能写一本书,所以建议还是用到的时候再去查,没必要面面俱到,真没必要!


二.RxJava中的变换操作符

2.1 map

map操作符使用过指定一个Function方法,将Observable转换成一个新的Observable对象并发射,就相当于我们访问网站被中间人篡改了网站信息进到了钓鱼网站,我们本来发射的是www.baidu.经过map操作以后,对原始内容进行了修改,最后我们发射到了腾讯的网站。 看代码:

 private void LogByMap() {ate(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> e) throws Exception {e.onNext("www.baidu");}}).map(new Function<String, String>() {@Overridepublic String apply(String s) throws Exception {return s+&#t";}}).subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(String s) {Log.d(TAG, "onNext: "+s);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

结果:

2.2 flatMap

flatMap操作符将Observable发射的数据集合变换为Observable集合,然后将这些Observable发射的数据平坦的放进一个单独的Observable

 private void LogByFlatMap(){ate(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> e) throws Exception {e.onNext("baidu");//发送的每一个事件都会经过flatMap的转换e.onNext("tencent");e.onNext("jd");}}).flatMap(new Function<String, ObservableSource<String>>() {//funtion的第一个参数是我们发射过来数据的类型//Observable中的参数类型是我们将要转变的类型@Overridepublic ObservableSource<String> apply(String s) throws Exception {//apply中的类型是原始Observable发射的数据类型//Observable<String>是我们将要转变的数据类型return Observable.just("www."+s+"");//返回的同样还是一个Observable,就相当于上游混浊的水经过中间一个自来水厂//变成了清澈的水,但是仍然还是水!自来水厂就相当于flatMap}}).subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(String s) {Log.d("flatMap", "onNext: "+s);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

FlatMap有点难懂,我们再举一个例子,假设有10名用户,每个人都有自己的编号,我们需要根据编号指定欢迎语。

private void LogByFlatMap2() {List<Integer> list = new ArrayList<>();for(int i=1;i<=10;i++){list.add(i);}Observable.fromIterable(list).flatMap(new Function<Integer, ObservableSource<String>>() {@Overridepublic ObservableSource<String> apply(Integer integer) throws Exception {return  Observable.just("welcome to join us:"+integer);}}).subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(String s) {Log.d("flatMap2", "onNext: "+s);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}


注意:flatMap的合并允许交叉,也就是说可能会交错的发送事件,最终的结果顺序可能并不是原始的Observable发送时的顺序!

2.3 concatMap

concatMap操作符功能和flatMap保持一致,他解决了flatMap交叉的问题,提供了一种能把发射的值连续在一起的函数,而不是合并他们。使用方法类似,这里不再贴代码。

2.4 flatMapIterable

该操作符可以将数据包装成IterableIterable中我们就可以对数据进行处理了

 private void LogByFlatMapIterable() {Observable.just(1,2,3).flatMapIterable(new Function<Integer, Iterable<Integer>>() {@Overridepublic Iterable<Integer> apply(Integer integer) throws Exception {List<Integer> list = new ArrayList<>();Log.d(TAG, "apply: ");list.add(integer);//1,2,3,所以这里会调用三次list.add(integer+1);return list;}}).subscribe(new Observer<Integer>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Integer integer) {Log.d("flatMapIterable", "onNext: "+integer);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

2.5 buffer

buffer操作符将源Observable变换为一个新的Observable,这个新的Observable每次发射一组列表,而不是一个个的发。

  private void LogByBuffer() {Observable.just(1,2,3,4,5,6).buffer(3).subscribe(new Observer<List<Integer>>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(List<Integer> integers) {for(int i:integers){Log.d(TAG, "onNext: "+i);}Log.d(TAG, "onNext: --------------------");}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});}

三.总结

关于RxJava的操作符还有很多,本篇主要介绍创建操作符和变换操作符,RxJava的内容很多,单独写都能写一本书,所以建议学习的时候不需要面面俱到,先会用,在熟练的用!

先别走,我有一个资源学习群要推荐给你,它是白嫖党的乐园,小白的天堂!

别再犹豫,一起来学习!

本文发布于:2024-02-04 19:29:31,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170714778558802.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:教程   Android   RxJava
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23