Android开发技术交流Android开发Android知识

RxJava学习笔记

2016-09-19  本文已影响70人  xiaobug

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<T> implements Observer<T>, Subscription {

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

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

Observable<Object> observable = Observable.create(new Observable.OnSubscribe<Object>() {    
  @Override    
  public void call(Subscriber<? super Object> subscriber) {
    subscriber.onNext("a"); 
    subscriber.onNext("b"); 
    subscriber.onNext("c"); 
    subscriber.onCompleted();
  }
});

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

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

Observable observable = Observable.just("a", "b", "c");
// 将会依次调用Subscriber中的回调方法:
// onNext("a");
// onNext("b");
// onNext("c");
// onCompleted();
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(调度器)。

现在就可以使用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<String>() {            
  @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<String, Bitmap>() { 
  @Override 
  public Bitmap call(String filePath) { // 参数类型 String 
    return getBitmapFromPath(filePath); // 返回类型 Bitmap 
   } 
  })
 .subscribe(new Action1<Bitmap>() { 
  @Override 
  public void call(Bitmap bitmap) { // 参数类型 Bitmap         
    showBitmap(bitmap); 
   } 
});

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

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

上一篇下一篇

猜你喜欢

热点阅读