这周计划开始系统地学习RxJava。
收集到的资料如下:
RxJava源码:https://repo1.maven.org/maven2/io/reactivex/
RxJava中文文档:https://mcxiaoke.gitbooks.io/rxdocs/content/
RxJava各操作符原理介绍:http://rxmarbles.com
一、创建Demo工程
我起先是直接将RxJava源码添加到工程里的,结果因为UnsafeAccess.java中的“import sun.misc.Unsafe”找不到而编译不过,只能作罢。
目前的做法是在采用项目依赖的方式引入:
dependencies {
......
compile 'io.reactivex:rxandroid:1.2.1'
......
}
其中的版本号:1.2.1,可以通过查看maven仓库中的最新版本来修改。 RxJava源码
二、目前的学习所得:
2.1 RxJava是基于观察者模式而设计的一种响应式编程思想;代码层面最直观的印象就是链式操作;
2.2 主要的类有:Observable(被观察对象)、Subscriber(订阅者/观察者)、Scheduler(线程调度)。
2.3 一个原生的RxJava的使用用例如下:
int mValue = 1;
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
if (!subscriber.isUnsubscribed()) {
// TODO: yourself things
// for xample
Log.e("chwn", "createOperByCreate>>call:mValue:" + mValue);
subscriber.onNext(mValue);
subscriber.onCompleted();
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Integer integer) {
}
});
在这个链式操作里,
Observable负责串联各个元素;
2.3.1 初始的Observable对象通常是根据咱们常见的单个数据对象、数组等创建的;上面代码中的“Observable.create”语句就是创建了一个初始的Observable对象。这里“create()”方法是RxJava中的创建操作符,“create”只是其中的一种方式;初始的Observable对象创建之后可以链式进行其他操作符处理,如变换、转换、过滤等处理;经过这些操作符处理后会产生新的Observable对象,所以这里才有“初始的Observable对象”之说。
2.3.2 Observable对象提供了两个方法subscribeOn()、observeOn()来允许用户干预处理过程中不同节点所在的线程。
Schedulers.io()和AndroidSchedulers.mainThread()都是调度器的一种,调度器的类型目前有6种,对外表现就是6种方法,常用的有:
Schedulers.io( )、Schedulers.newThread( )、Schedulers.computation( )。AndroidSchedulers.mainThread()是专为Android定义的,指的是UI线程。
2.3.3 Observable对象提供了方法subscribe()与Subscriber建立联系。可以充当观察者的类型,除了Subscriber类型外,还有Action1、Action2、......、Action9、ActionN;Action系列的观察者是简化版的,其提供给Observable对象调用的就只有call()这一个方法;
2.3.4 Subscriber类型的观察者类有三个方法onCompleted()、onError()、onNext;其中onNext是Observable对象用来将处理结果发射给观察者的,可能会被Observable对象多次调用。其入参即是当前的处理结果;其他两个顾名思义,onError是只有在处理遇到异常时才会调用的,一旦调用了则不会再调用其他两个方法;onCompleted()是在处理正常onNext完毕后才被调用的,也是只调用一次。
2.4 RxJava学习的内容,除了理解响应式、函数式编程思想外,最具象的内容就是操作符的学习和使用。Observable是个神奇的对象,只要我们把要处理的数据或者任务想办法转化成Observable对象,就可以逻辑简洁优雅地链式写代码了。