RxJava是什么?
RxJava 在 GitHub 主页上是这样说的 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。
恩,简单来说,异步操作库。
RxJava的特点?
简洁。
这里的简洁并不是指代码长度,而是逻辑上的简洁。具体的解释可以看下扔物线大大的博客,里面介绍的很详细:给 Android 开发者的 RxJava 详解
为什么选择RxJava2?
Rxjava 2 vs Rxjava1 ,是否要升级?
总结一下:Rxjava2在背压问题上做出了解决方案,提升了性能,但相应的,部分写法变得更加复杂。
现阶段Rxjava还在维护,使用的话,完全没有问题;但是,如果你的应用还有较长的使用时间,而且有像传感器那样一秒连戳几十下的操作,那最好还是升级到Rxjava2;
个人评价:
如果是跟我一样之前没搞过Rxjava,那么感觉还是直接从Rxjava2学起吧,毕竟以后还是要学的,这一刀跑不了。
难度方面:
如果没有点基础,刚上来还是有点难度的,毕竟从最直观的代码长度上来看,RxJava没有太大优势,而且要想理解其中的原理还是有点难度的;不过只是想学会怎么用的话,难度还是可以的。(顺便吐槽下,好多都是讲一遍观察者,订阅者,订阅关系………………,讲这么多名词,绕都绕晕了,刚上来谁知道订阅是个什么东西啊)
顺便提一下这篇博客:给初学者的RxJava2.0教程(一),感觉写的非常不错。
build.gradle中加入
compile "io.reactivex.rxjava2:rxjava:2.0.7"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
最简单的Rxjava2的使用就像下面这样:
//创建订阅者
Subscriber subscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
//这一步是必须,我们通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成
//调用request()方法,会立即触发onNext()方法
//在onComplete()方法完成,才会再执行request()后边的代码
s.request(Long.MAX_VALUE);
}
@Override
public void onNext(String value) {
Log.e("onNext", value);
}
@Override
public void onError(Throwable t) {
Log.e("onError", t.getMessage());
}
@Override
public void onComplete() {
//由于Reactive-Streams的兼容性,方法onCompleted被重命名为onComplete
Log.e("onComplete", "complete");
}
};
Flowable.create(new FlowableOnSubscribe() {
@Override
public void subscribe(FlowableEmitter e) throws Exception {
e.onNext("Hello,I am China!");
}
}, BackpressureStrategy.BUFFER)
.subscribe(subscriber);
具体分析一下的话,可以这么想象:
你的Boss现在给你提了个需求:
有两种盒子,一种名叫Flowable
,一种名叫Subscriber
,其中Flowable
放了很多个小球,现在你要做的事,就是把Flowable
中的小球放到Subscriber
中,然后读出来贴在小球上的标签。
那么,我们该怎么做呢?
第一步,首先要挑出这两个盒子,名为Flowable
的盒子就是通过create方法创建,称之为被观察者,名为Subscriber
的盒子可以直接new出来,称之为观察者/订阅者。
第二步,就是要确定,我是要把Flowable
中的小球放到哪个Subscriber
中,这就是代码中的subscribe
方法,告诉Flowable
,你的小球发到哪个Subscriber
盒子中,这个过程就叫做订阅。
第三步,就可以动手把Flowable
中的小球拿出来了,拿出小球的过程就是Flowable
.create
方法中的subscribe
。
@Override
public void subscribe(FlowableEmitter e) throws Exception {
e.onNext("Hello,I am China!");
}
在这个方法中,出现了一个FlowableEmitter
,这个Emitter
就是发射器的意思,可以想象成拿出小球的那只手;e.onNext("Hello,I am China!");
可以理解为,用名为FlowableEmitter
的手,拿出一个带有"Hello,I am China!"
标签的小球。如果你要想再拿出个小球,那就再写一遍onNext
即可;
第四步,好了,拿出小球了,总要放到另一个盒子中吧,这时候就到了Subscriber
这个盒子中了。首先,这个盒子跟上个盒子Flowable
稍微有点不同,它有一个盖子:Subscription
。
@Override
public void onSubscribe(Subscription s) {
//这一步是必须,我们通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成
//调用request()方法,会立即触发onNext()方法
//在onComplete()方法完成,才会再执行request()后边的代码
s.request(Long.MAX_VALUE);
}
这个盖子的作用就是控制进入Subscriber
中小球的数量和速度的,还记得Rxjava2和Rxjava1的区别之一——背压问题么,这块就是通过这个盖子来控制解决的;如果,你不想让小球进入盒子,那么直接Subscription.cancle()
,如果想让每回只进入10个小球,那就Subscription.request(10)
;当然,背压问题不是仅仅这么就能解决的,具体解决方案在后面会提到。
第五步,ok,小球放进去了,就剩读标签这个操作了,读标签这个操作就是onNext
方法,相应的出错和完成方法就是onError
和onComplete
@Override
public void onNext(String value) {
Log.e("onNext", value);
}
@Override
public void onError(Throwable t) {
Log.e("onError", t.getMessage());
}
@Override
public void onComplete() {
//由于Reactive-Streams的兼容性,方法onCompleted被重命名为onComplete
Log.e("onComplete", "complete");
}
到这里,基本的简单使用,就是这样,当然用Rxjava2不可能就这么使用就ok了,异步操作这一重点会放到下一章来说明。不过现在要学习的是retrofit