RxJava学习笔记

1.RxJava是个啥?

一个异步响应式扩展库

GitHub上的RxJava链接
https://github.com/ReactiveX/RxJava
https://github.com/ReactiveX/RxAndroid

添加gradle依赖:

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

RxJava操作符的介绍
推荐大家看看操作符分类这篇文章

2.基本使用

1.创建Subscriber订阅者
她决定了事件触发的时候将有怎样的行为。RxJava中的Subscriber的实现方式:

Subscriber subscriber= new Subscriber() {    
   @Override    
  public void onCompleted() {     }    
  @Override    
  public void onError(Throwable e) {    }    
  @Override    
  public void onNext(Object o) {    }
};

顺道看一眼Subscriber这个类

public abstract class Subscriber implements Observer, Subscription {

我们知道了,Subscriber实现了Observer(观察者)这个接口,是在观察者基础上的扩展,所以Subscriber的功能比Observer更丰富。

2.创建Observable被观察者
他决定什么时候触发事件以及触发怎样的事件。
RxJava提供了很多创建Observable对象的方法,我们一个一个看:

  • Observable.create()方法,这里会出入一个OnSubscribe参数,通过查看源码,发现,OnSubscribe最终继承了Function接口,而这个接口中啥也没有,我觉得OnSubscribe这个接口主要作用是统一规范,并没有啥特殊的作用,而他里面的call()方法是定义事件发送规则的核心方法。
Observable observable = Observable.create(new Observable.OnSubscribe() {    
  @Override    
  public void call(Subscriber subscriber) {
    subscriber.onNext("a"); 
    subscriber.onNext("b"); 
    subscriber.onNext("c"); 
    subscriber.onCompleted();
  }
});
 
 

这里有一个需要注意的地方就是,当Observabele被订阅时,OnSubscribe中的call()方法会被自动调用,call()方法会 依次 执行Subscriber的回调方法,这样,由于被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。

基于Observable.create()方法,RxJava 还提供了一些方法用来快捷创建事件队列,例如:

  • just(T t1, T t2, T t3...)将传入的参数依次发送出来
Observable observable = Observable.just("a", "b", "c");
// 将会依次调用Subscriber中的回调方法:
// onNext("a");
// onNext("b");
// onNext("c");
// onCompleted();
  • from(Object[] o)/from(Iterable),将传入的数组或Iterable拆分为对象后,依次发送出来。
String[] s= {"a", "b", "c"};
Observable observable = Observable.from(s);
// 将会依次调用Subscriber中的回调方法:
// onNext("a");
// onNext("b");
// onNext("c");
// onCompleted();

3.subscribe()订阅
创建了Observable和Subscriber后,用subscribe()方法将他们关联起来。

observable.subscribe(subscriber);

3.线程控制

如果不指定线程的情况下,RxJava遵循的是线程不变的原则,即:在哪个线程调用subscribe(),就在哪个线程生产事件;在哪个线程生产事件,就在哪个线程消费事件。如果需要切换线程,就需要用到Scheduler(调度器)。

  • Schedulers.immediate(): 直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
  • Schedulers.newThread(): 总是启用新线程,并在新线程执行操作。
  • Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)所使用的Scheduler。行为模式和newThread()差不多,区别在于io()的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下io()比newThread()更有效率。不要把计算工作放在io()中,可以避免创建不必要的线程。
  • Schedulers.computation(): 计算所使用的Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个Scheduler使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在computation()中,否则 I/O 操作的等待时间会浪费 CPU。
  • 另外, Android 还有一个专用的AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。

现在就可以使用subscribeOn()和observeOn()两个方法来对线程进行控制了。
**subscribeOn(): **指定subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程。
observeOn(): 指定Subscriber所运行在的线程。或者叫做事件消费的线程。

举个栗子:

String[] s = {"a","b","c"};

Observable.from(s)        
.subscribeOn(Schedulers.io())//subscribe()方法发生在IO线程 
.observeOn(AndroidSchedulers.mainThread())//Subscriber回调发生在主线程        
.subscribe(new Action1() {            
  @Override            
  public void call(String s) {      }        
});

subscribeOn(Scheduler.io()和observeOn(AndroidSchedulers.mainThread())
的使用方式非常常见,它适用于多数的 『后台线程取数据,主线程显示』的程序策略。

4.RxJava中的变换

1.map():事件对象的直接变换,具体功能上面已经介绍过。它是 RxJava 最常用的变换。

Observable.just("images/logo.png") // 输入类型 String 
.map(new Func1() { 
  @Override 
  public Bitmap call(String filePath) { // 参数类型 String 
    return getBitmapFromPath(filePath); // 返回类型 Bitmap 
   } 
  })
 .subscribe(new Action1() { 
  @Override 
  public void call(Bitmap bitmap) { // 参数类型 Bitmap         
    showBitmap(bitmap); 
   } 
});

这里出现了一个叫做Func1的类。它和Action1非常相似,也是RxJava 的一个接口,用于包装含有一个参数的方法。Func1和Action的区别在于,Func1包装的是有返回值的方法。另外,和Action一样,FuncX也有多个,用于不同参数个数的方法。FuncX和ActionX的区别在FuncX包装的是有返回值的方法。

最后要说的话:
强烈推荐:给 Android 开发者的 RxJava 详解
本文便是我学习之后所做的简单笔记

你可能感兴趣的:(RxJava学习笔记)