【Android】RxJava之初始篇

关于RxJava

RxJava是ReactiveX推出在Java VM环境下使用的异步操作库。除了在Java环境ReactiveX也为其他编程语言推出Rx库,例如Py、Js、Go等。网上有很多关于对RxJava的介绍和使用,在Android开发中也有很多项目使用RxJava。那为什么还要使用RxJava呢,Android开发也有提供异步操作的方法供开发者使用,我想应该是RxJava比起Handle、AsyncTask简洁优雅。

  • 1 RxJava采用链式调用,在程序逻辑上清晰简洁
  • 2 采用扩展式观察者设计模式

关于观察者模式以及其他RxJava的介绍这个就不做重复,下面内容主要围绕RxJava和RxAndroid使用。对于RxJava官方文档已经有详细介绍,本节是以学习讨论为主,如存在错误的地方希望大家可以指出。

被观察者Observable

使用RxJava需要创建Observable,Observable用于发射数据。如下Observable的create方法需要传入一个OnSubscribe,其继承于Action1<Subscriber<? super T>>,Action中的Subscriber就是订阅者。


  1. public static <T> Observable<T> create(OnSubscribe<T> f) { 
  2.     return new Observable<T>(RxJavaHooks.onCreate(f)); 
  3. }  

另外create方法中需要实现接口call,返回subscriber对象。call方法实现在observable订阅后要执行的事件流。subscriber.onNext发射data,subscriber.onCompleted可以表示发射事件结束。接着调用observable的subscribe方法实现被订阅后执行的事件流。


  1. Observable<String> observable = Observable 
  2.                 .create(new Observable.OnSubscribe<String>() { 
  3.  
  4.             @Override 
  5.             public void call(Subscriber<? super String> subscriber) { 
  6.                 subscriber.onNext("1"); 
  7.                 subscriber.onNext("2"); 
  8.                 subscriber.onNext("3"); 
  9.                 subscriber.onNext("4"); 
  10.                 subscriber.onNext("5"); 
  11.             } 
  12. }); 
  13. Subscriber<String> subscriber = new  Subscriber<String>() { 
  14.             @Override 
  15.             public void onCompleted() { 
  16.  
  17.             } 
  18.  
  19.             @Override 
  20.             public void onError(Throwable e) { 
  21.  
  22.             } 
  23.  
  24.             @Override 
  25.             public void onNext(String s) { 
  26.                 System.out.print(s + '\n'); 
  27.             } 
  28. }; 
  29. observable.subscribe(subscriber); 
  30. //输出结果 print: 
  31. //1 
  32. //2 
  33. //3 
  34. //4 
  35. //5   

Observable除了使用create方法创建外还可以使用from或者just快速设置发射的事件流,简化了create的步骤。

 


  1. Observable<String> o = Observable.from("a", "b", "c");  

 


  1. Observable<String> o = Observable.just("one object"); 

说好的异步操作

RxJava的线程由Schedulers调度者控制,通过它来控制具体操作在什么线程中进行。

  • Schedulers.immediate() 在当前线程中执行
  • Schedulers.newThread() 为每一个任务开辟线程执行
  • Schedulers.computation() 计算任务运行的线程
  • Schedulers.io() IO任务运行的线程....
  • AndroidSchedulers.mainThread() Android 主线程运行

对于线程的控制主要由subscribeOn()和observeOn()两个方法控制:

  • subscribeOn 控制Observable.OnSubscribe所处的线程,等同于Observable create、just、from时所处的线程。
  • observeOn 控制Subscriber的线程,也可以说是控制事件被执行时所在的线程。

  1. Observable 
  2.         .just(1,2,3) 
  3.         .subscribeOn(Schedulers.io()) 
  4.         .observeOn(AndroidSchedulers.mainThread()) 
  5.         .subscribe(new Subscriber<Integer>() { 
  6.             @Override 
  7.             public void onCompleted() { 
  8.  
  9.             } 
  10.  
  11.             @Override 
  12.             public void onError(Throwable e) { 
  13.  
  14.             } 
  15.  
  16.             @Override 
  17.             public void onNext(Integer integer) { 
  18.                  System.out.print(integer + '\n');                        
  19.             } 
  20. }); 
  21. //输出结果 print: 
  22. //1 
  23. //2 
  24. //3  

写下上面的RxJava链式调用的代码,有没有觉得比以前使用的异步调用清爽许多,对处女座还说这很治愈!

操作符Operators

ReactiveX提供超级多的操作符,每个操作符都具有不同的功能,但目的都是在Observable和Subscribe之间变换和修改发射出去的事件流。这节介绍几个比较常见简单的操作符,之后有机会再写一节操作符篇详细说说每个操作符的作用。附上官方操作符文档看看就知道有多少多了。

  • Map() 

  1. public final <R> Observable<R> map(Func1<? super T, ? extends R> func) { 
  2.         return create(new OnSubscribeMap<T, R>(this, func)); 
  3.     }   

首先先介绍一个操作符map,map实现Func1接口将T类型数据变换为R类型数据,返回R类型数据。例如传入Integer类型的事件队列,经过map加工之后以String类型返回。


  1. Observable 
  2.                 .just(1,2,3) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .map(new Func1<Integer, String>() { 
  6.                     @Override 
  7.                     public String call(Integer integer) { 
  8.                         return integer + ""; 
  9.                     } 
  10.                 }) 
  11.                 .subscribe(new Subscriber<String>() { 
  12.                     ...... 
  13.                     @Override 
  14.                     public void onNext(String str) { 
  15.                         System.out.print(str + '\n'); 
  16.                     } 
  17.                 }); 
  18. //输出结果 print: 
  19. //1 
  20. //2 
  21. //3  
  • Filter() 

  1. public final Observable<T> filter(Func1<? super T, Boolean> predicate) { 
  2.        return create(new OnSubscribeFilter<T>(this, predicate)); 
  3.    }   

filter和map一样实现Func1接口不过它变换之后的类型为boolean,对发射的事件流进行筛选,当变换后的boolean值为true,订阅者才能收到通过筛选的事件,反之该事件不被消费。例如事件流筛选要求当int值可被2整除才能继续传递,所以最后订阅者可消费的事件为2,4,6,8,10。


  1. Observable 
  2.                 .just(1,2,3,4,5,6,7,8,9,10) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .filter(new Func1<Integer, Boolean>() { 
  6.                     @Override 
  7.                     public Boolean call(Integer integer) { 
  8.                         return integer % 2 == 0; 
  9.                     } 
  10.                 }) 
  11.                 .map(new Func1<Integer, String>() { 
  12.                     @Override 
  13.                     public String call(Integer integer) { 
  14.                         return integer + ""; 
  15.                     } 
  16.                 }) 
  17.                 .subscribe(new Subscriber<String>() { 
  18.                    ...... 
  19.                     @Override 
  20.                     public void onNext(String str) { 
  21.                         System.out.print(str + '\n'); 
  22.                         Log.i("subscribe", str); 
  23.                     } 
  24.                 }); 
  25. //输出结果 print: 
  26. //2 
  27. //3 
  28. //4 
  29. //6 
  30. //8 
  31. //10  
  • Skip()

  1. public final Observable<T> skip(int count) { 
  2.         return lift(new OperatorSkip<T>(count)); 
  3.     } 

skip操作符表示跳过前几个事件从某一个事件开始发射事件,下标从0开始。


  1.  Observable 
  2.                 .just(1,2,3,4,5,6,7,8,9,10) 
  3.                 .subscribeOn(Schedulers.io()) 
  4.                 .observeOn(AndroidSchedulers.mainThread()) 
  5.                 .skip(3) 
  6.                 .map(new Func1<Integer, String>() { 
  7.                     @Override 
  8.                     public String call(Integer integer) { 
  9.                         return integer + ""; 
  10.                     } 
  11.                 }) 
  12.                 .subscribe(new Subscriber<String>() { 
  13.                     ...... 
  14.                     @Override 
  15.                     public void onNext(String s) { 
  16.                         System.out.print(s + '\n'); 
  17.                         Log.i("subscribe", s); 
  18.                     } 
  19.                 }); 
  20. //输出结果 print: 
  21. //4 
  22. //5 
  23. //6 
  24. //7 
  25. //8 
  26. //9 
  27. //10  
  • Range()

  1. public static Observable<Integer> range(int start, int count) { 
  2.         if (count < 0) { 
  3.             throw new IllegalArgumentException("Count can not be negative"); 
  4.         } 
  5.         if (count == 0) { 
  6.             return Observable.empty(); 
  7.         } 
  8.         if (start > Integer.MAX_VALUE - count + 1) { 
  9.             throw new IllegalArgumentException("start + count can not exceed Integer.MAX_VALUE"); 
  10.         } 
  11.         if(count == 1) { 
  12.             return Observable.just(start); 
  13.         } 
  14.         return Observable.create(new OnSubscribeRange(start, start + (count - 1))); 
  15.     }   

 

range操作符可以理解为just,from传递一个连续的int类型待发射数组,n为起始int值,m为Count。例如n = 1,m = 5 int数组就是{1,2,3,4,5}

结尾

这节先学习到这,算是对RxJava的初步认识和学习。其实运用RxJava主要还是依赖于对操作符的使用,前面所介绍的操作符属于最最简单基础的,还有很多特别有用的操作符没有介绍。之后再继续介绍一些操作符。RxJava在Android开发中很受欢迎,就是因为它的强大,同时RxJava可以和Retrofit组合使用,更高效处理网络请求回值。另外GitHub GoogleSample上的android-architecture也有使用RxJava框架的TODO项目,可以看看理解RxJava在项目中的实践应用。

作者:一个无

来源:51CTO

时间: 2024-10-22 02:10:25

【Android】RxJava之初始篇的相关文章

Android滑动效果进阶篇(六) 倒影效果

上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘制 ImageAdapter继承自 BaseAdapter,详细实现可见 Android 滑动效果入门篇(二)-- Gallery 这里重点介绍倒影原理及实现 倒影原理: 倒影效果是主要由原图+间距+倒影三部分组成,高度大约为原图的3/2(原图为1.倒影为1/2) 原图,就是我们 看到了最开始的图片

Android开源项目第一篇——个性化控件(View)篇

本文为那些不错的Android开源项目第一篇--个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 本文中你可以找到那些精美App中各种有特性的View,如Gmail的左滑出菜单.Google plus的卡片式L

Android开源项目第二篇——工具库篇

Android开源项目第二篇--工具库篇 本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他.   最新内容请访问AndroidOpenProject@Github,欢迎Star和Fork.   Android开源项目系列汇总已完成,包括: Android开源项目第一篇--个性化控件(View)篇Android开源项目第二篇--工具库

Android 滑动效果基础篇(三)—— Gallery仿图像集浏览

Android系统自带一个Gallery浏览图片的应用,通过手指拖动时能够非常流畅的显示图片,用户交互和体验都很好. 本示例就是通过Gallery和自定义的View,模仿实现一个仿Gallery图像集的图片浏览效果.效果图如下: 1.基本原理 在 Activity 中实现 OnGestureListener 的接口 onFling() 手势事件,通过自定义的 View 绘制draw() 图片 2.Activity Activity中,通过onTouchEvent() 注册 myGesture.o

Android 滑动效果进阶篇(六)—— 倒影效果

http://blog.csdn.net/sunboy_2050/article/details/7483169 上篇介绍了使用Animation实现3D动画旋转翻页效果,现在介绍图片倒影实现,先看效果图 本示例主要通过自定义Gallery和ImageAdapter(继承自BaseAdapter)实现 1.倒影绘制 ImageAdapter继承自BaseAdapter,详细实现可见 Android 滑动效果入门篇(二)-- Gallery 这里重点介绍倒影原理及实现 倒影原理: 倒影效果是主要由

Android开发小技巧篇之集合

1.对于过多的控件,功能类似,数量又多的,可以用include方法.在实现应用中,可以把控件放入List集合中. private void initView() { // TODO Auto-generated method stub pwd1 = (EditText) findViewById(R.id.pwd_et_6_1); pwd2 = (EditText) findViewById(R.id.pwd_et_6_2); pwd3 = (EditText) findViewById(R.i

浅谈Android开发系列网络篇之Retrofit_Android

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了.这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了.先来看一个官网的例子,详细说明去网官看 简单示例 首先定义请求接口,即程序中都需要什么请求操作 public interface GitHubService { @GET("/use

浅谈Android开发系列网络篇之Retrofit

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了.这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了.先来看一个官网的例子,详细说明去网官看 简单示例 首先定义请求接口,即程序中都需要什么请求操作 public interface GitHubService { @GET("/use

Android性能系列-内存篇

内存篇 1) Memory, GC, and Performance 众所周知,与C/C++需要通过手动编码来申请以及释放内存有所不同,Java拥有GC的机制.Android系统里面有一个Generational Heap Memory的模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作.例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速