RxJava学习

#Rxjava

什么是Rxjava

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)
最主要的是异步。响应式编程,事件流。好处是可以让代码更容易维护。
例如 :解决回调地狱
多个回调,层级多,阅读性特别差,那么用rxjava就会解决这样的问题。
Rxjava的原理是基于观察者模式

Rxjava的使用

引入
在项目的build.gradle文件下添加
dependencies {
compile ‘io.reactivex:rxjava:1.3.0’
compile ‘io.reactivex:rxandroid:1.2.1’
}

  • 创建Observer和Observable
  • Observable订阅Observer 如:observable.subscribe(subscriber);
  • Observable 产生事件数据逻辑
  • Observer 消费事件

使用Rxjava了解几个概念
Observable(被观察者), Observer(观察者),subscribe(订阅)
Observable是被观察的对象,例如电影院的电影,Observer相当于观众,subscribe相当于影院将Observable和Observer联系起来。如电影发生了变化,观众就是会接受到变化。
简单的说,Observable相当发射数据源,Observer是接受处理数据的。

Observer的创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Observer<String> observer=new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
};

Observer是最基本的创建方式,下面的Subscriber也是实现了Observer,不过多了两个方法一个onStar,一个setProducer,和一个可以调用的unsubscribe的方法用于取消订阅。
如:观众.unsubscribe();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Subscriber<String> 观众=new Subscriber<String>() {
@Override
public void onStart() {
super.onStart();
}
@Override
public void setProducer(Producer p) {
super.setProducer(p);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String o) {
Log.d("观众",o);
} };

那么首先创建发射源就是Observable,它决定了什么时候触发事件及事件的规则:

1
2
3
4
5
6
7
8
9
10
Observable<String> 电影院 =Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("电影开始了");
subscriber.onNext("电影很精彩,已经多了一个小时了");
subscriber.onNext("电影结束了,散场吧");
subscriber.onCompleted();
}
}); //这个api 已经过时
电影.subscribe(观众); //订阅事件

Observable传入了一个OnSubscribe对象参数,这个参数会有一个回调方法call,call中的subsriber,就是你要给Observer(观众)传递的消息。依次序的发送你想执行的消息(例如 告诉观察者 电影开始了 ,电影很精彩,已经多了一个小时了,电影结束了)等当事件订阅是会自动调用call();

运行结果:

操作符

  • just from, 将多个数据一次一次发送完毕, 完毕后自动调用onCompleted,之后无法接受
    使用于 数据已经备齐,然后发出。适合最终,不适合过程中。

    1
    2
    Observable<String> observable=Observable.just("我是","just");
    observable.subscribe(subscriber);
  • create():可以定制发送流程

  • 其他操作符例子 其他操作符博客

线程调度

默认情况下 在哪个线成下订阅subscribe(),就这哪个线程产生事件和消费事件。那么如何改变线程呢,如像Android中后台请求数据,主线程显示数据呢那就要用到
线程调度器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 主线程运行
    有两个方法可以对Scheduler做操作
    subscribeOn()observeOn() ,subscribeOn()事件产生的线程 和 observeOn() 事件消费的线程
    1
    2
    3
    4
    Observable<String> observable=Observable.just("我是","just").
    subscribeOn(Schedulers.io()). //指定发射源在那个线程(subscribe)
    observeOn(AndroidSchedulers.mainThread());//指定接受这在哪个线程(Observable)
    observable.subscribe(subscriber);

控制订阅发生在那个线程,回调后操作在那个线程。

部分回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Action action=new Action0() {
@Override
public void call() {
Log.e("rx","completed");
}
};
Action1<String> next=new Action1<String>() {
@Override
public void call(String o) {
Log.e("rx",o);
}
};
Action1<Throwable> throwableAction1=new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
};
//自动创建一个Subscriber 并包装方法
observable.subscribe(next); //自动创建 Subscriber 相当于onNext
observable.subscribe(next,throwableAction1); //onNext onError
observable.subscribe(next,throwableAction1,action);//onNext onError onCompleted


上面的代码可以,相当于一个Subscriber,但是写的更少更简洁。可以看出subscribe()这个方法重载了多个。action0和action1两个部分函数的区别是
}
action0无参数和返回值,aciton1有参数无返回值。通过这两个方法可以替代Subscriber中的onNext,onError,onCompleted的方法

学习资料
1.Rxjava详解
2.操作符大全博客