一篇RxJava友好的文章(一)

Rxjava在目前的开发中已经是如火如荼,非常的流行,唯一的就是上手不太容易,学习成本高,学习rxjava有一段时间了,也看了老罗的rxjava视频,决定自己总结下。

准备

在android工程中的gradle.build中配置,为了更好的理解,所以导入java8 的lambda 表达式。

compile 'io.reactivex:rxjava:1.2.1'
compile 'io.reactivex:rxandroid:1.2.1'

基础

rxjava 中有两个核心的对象Observable(被观察者,它会发出一系列的事件源)和Subscribers(观察者,接受事件源),Observable发出事件后,中间可以有一系列的操作、变化,可以精确的控制事件,最终被观察者所接收。其中Observable每发出一个事件就会,就会调用他的subscriber 的onext(),直到发生错误onerror()或onComplete()结束。

1.用Observable.create去创建一个Observable对象,并发射一个”hi Rxjava”,就结束。

Observable<String> observable= Observable.create(
      new Observable.OnSubscribe<String>() {    
   @Override   
   public void call(Subscriber<? super String>    subscriber)
   {  
      subscriber.onNext("hi RxJava");           
      subscriber.onCompleted();   
  }});

然后,我们需要去创建一个subscriber去处理observable发射过来的数据。

Subscriber<String> subscriber=new Subscriber<String>() {
   @Override  
   public void onCompleted() {     
      Log.e(TAG,"onCompleted"); 
   }   
  @Override  
   public void onError(Throwable e) {                    
      Log.e(TAG,e.getMessage());   
   }    
  @Override
  public void onNext(String s) {     
      Log.e(TAG,s);   
  }};

最后需要,subscribe函数把observable对象和subscriber对象关联起来,这样就完成了subscriber对observable的订阅。

observable.subscribe(subscriber);

程序运行一下:

可能你觉得这样太复杂了,但是涉及到了与之前不一样的变成思想,即响应式编程。

2.用just去创建observable,just英语意思是仅仅的意思,如果只发出一个事件可以用这种方式。另外在创建Subscriber的时候,如果仅仅关心onNext(),这时可以用Action1这个对象。

Observable.just("hi Rxjava2").subscribe(new Action1<String>() {    
   @Override 
   public void call(String s) {       
      Log.e(TAG,s);  
  }});

运行程序:

3.用from创建observable,这种方式创建,需要传入一个集合,它会一个一个的发射,在subscriber上它会一个一个的接收。

String [] strs={"1","2","3","4"};
Observable.from(Arrays.asList(strs))
.subscribe(new Action1<String>() {   
   @Override   
    public void call(String s) {       
        Log.e(TAG,s);    
 }});

运行程序:

是不是有点像高级for循环-.- 。

4.操作符map,是用在observable和subcriber中间,是为了操作observable发射的数据,操作之后的数据,会被subcriber 接收。rxjava有很多操作符,map操作符是将一个事件转换为另一个事件的。

Observable.just("hi rxjava")
.map(new Func1<String, String>() {  
  @Override    
  public String call(String s) {    
    return s+" ,你好rxjava";   
   }})
.subscribe(new Action1<String>() {    
     @Override    
     public void call(String s) {    
        Log.e(TAG,s);   
  }});

运行程序:

另外,map操作符可以将转换类型,比如string 转int .

Observable.just("hi rxjava")
.map(new Func1<String, Integer>() { 
   @Override    
    public Integer call(String s) { 
       return s.hashCode();    
   }})
.subscribe(new Action1<Object>() { 
   @Override  
    public void call(Object s) {    
       Log.e(TAG,s+"");   
 }});

5.flatmap操作符 flatMap操作符接收一个Observable的输出作为输入,同时输出另外一个Observable。在flatMap操作符中,我们可以做一系列的事情,然后输出的新的Observable,这个Observable是我们在Subscriber想要接收的。

Observable.create(new Observable.OnSubscribe<List<String>>() {    
  @Override   
  public void call(Subscriber<? super List<String>> subscriber) {           
      String [] strs={"1","2","3","4","5","6","7"};           
      subscriber.onNext(Arrays.asList(strs));   
 }})
.flatMap(new Func1<List<String>, Observable<?>>() {    
   @Override 
   public Observable<?> call(List<String> list) {     
      return Observable.from(list);  
   }})
.subscribe(new Action1<Object>() { 
   @Override   
   public void call(Object o) {  
      Log.e(TAG,o.toString());  
  }});

首先Observable发出一个list , 然后经过flatmap 将其变成from创建的Observable,这个Observable将list中的元素一个一个的发射,然后,subcriber 中接收。

运行程序:

6.filter 操作符,对Observable发射的数据进行过滤操作,哪有subcriber接收 ,哪些不接收。

Observable.create(new Observable.OnSubscribe<List<String>>() {    
   @Override 
   public void call(Subscriber<? super List<String>> subscriber) {        
      String [] strs={"1","2","3","4","5","6","7"};          
      subscriber.onNext(Arrays.asList(strs));   
   }})
.flatMap(new Func1<List<String>, Observable<?>>() {    
   @Override 
   public Observable<?> call(List<String> list) {   
     return Observable.from(list);  
  }})
.filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;    
   @Override 
   public Boolean call(Object o) {        
     if(o.toString().equals("1"))return false;   
     return true;    
}})
.subscribe(new Action1<Object>() {
  @Override    
  public void call(Object o) {        
    Log.e(TAG,o.toString()); 
 }});

运行程序:

7.take操作符,固定返回数量。take(2),返回2个结果。

Observable.create(new Observable.OnSubscribe<List<String>>() {    
  @Override  
  public void call(Subscriber<? super List<String>> subscriber) {        
    String [] strs={"1","2","3","4","5","6","7"};        
    subscriber.onNext(Arrays.asList(strs));    
 }})
.flatMap(new Func1<List<String>, Observable<?>>() {    
  @Override   
   public Observable<?> call(List<String> list) {  
      return Observable.from(list);  
  }})
.filter(new Func1<Object, Boolean>() {//filter 操作符,去掉“1”;    
   @Override   
   public Boolean call(Object o) {        
     if(o.toString().equals("1"))return false;     
     return true;    
 }})
.take(2)
.subscribe(new Action1<Object>() {//take 操作符,最多输出的数量    
   @Override  
   public void call(Object o) {     
       Log.e(TAG,o.toString());  
  }});

运行程序:

rxjava中还有很多操作符,具体见官网文档中文文档,操作符可以让你对数据流做任何操作。多个操作符配合起来,可以让很复杂的逻辑变得简单,同时,在操作数据的过程中,subcriber并不需要知道中间做了那些操作,只需要知道返回的结果,操作数据也变的简单。

源码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏XAI

调用腾讯优图开放平台进行人脸识别-Java调用API实现

? 第一步:鉴权服务技术方案 Java代码实现如下 import java.util.Date; import com.baidu.aip.util...

27010
来自专栏三流程序员的挣扎

RxJava 组合操作符

现在看上面的最后一个方法,最后一个参数是多个 Observable,第二个参数 bufferSize 是内部缓冲队列的大小。

1853
来自专栏安恒网络空间安全讲武堂

经典加密法

经典加密法 01 仿射加密法 在说仿射加密之前,有必要先说一下单码加密。单码加密法具有固定替换模式的加密方法,即明文中的每个字母就由密文中的一个字母所替换。而仿...

2368
来自专栏三流程序员的挣扎

RxJava 算术和聚合操作符

将依次连续发送 observableStr,observableInt,observableBoolean 里的 12 个数据。

2074
来自专栏史上最简单的Spring Cloud教程

常见的安全算法

本文整理了常见的安全算法,包括MD5、SHA、DES、AES、RSA等,并写了完整的工具类(Java 版),工具类包含测试。 一、数字摘要算法 数字摘要也称为...

2517
来自专栏Android机动车

RxJava从入门到不离不弃(四)——过滤操作符

RxJava中的过滤操作符,顾名思义,这类操作符主要用于对事件数据的筛选过滤,只返回满足我们条件的数据。

1093
来自专栏Ken的杂谈

C#加密解密(AES)-AESHelper

3262
来自专栏编程坑太多

java操作ftp

3643
来自专栏XAI

调用腾讯优图开放平台进行人脸识别-Java调用API实现

保存SIGN 或者每次都生成一个也可以 方便测试就直接每次生成一个了

2.2K13
来自专栏三流程序员的挣扎

RxJava 过滤操作符

现在想到的应用场景也许是某些 Callable 返回的数据之类,先过滤拿到第一个,然后再用 Observable 发射这第一个数。

1251

扫码关注云+社区