安卓小白一枚,刚开始研究 RxJava,随手记录,过于基础的内容,新学习的小伙伴一起讨论,大神轻拍,有不对的地方感谢指导,立马整改!
无聊的前篇
一直都知道有RxJava这么个东西,也知道很好用。但是手里的都是遗留下来的老项目,没有用到,也没有研究,最近有点时间,赶紧恶补一下。
更无聊的基础概念 :
- 什么是RxJava?(似乎只有我自己不知道--!!!)
说白了就是Rx 的 Java的实现。什么是Rx?就是 Reactive Extensions的缩写。Reactive Extensions又是什么呢?英语小白的我赶紧翻开已经落了一层厚厚的灰的《牛津高阶英汉词典》!(对,我什么方面都是小白!我超白!)中文意思是 响应式扩展。意思就是......emmmmm......
我们看官方介绍吧(--|||)
好了,这里就应该知道RxJava的概念了吧! (然而我是一脸懵 B~)
好吧, 概念解释什么的官方说的很官方~
各路大神也能够给出特别好的介绍, 我这么白就不BB了!
上干货!!!
RxJava的基础实现
- 配置 Android studio 的 gradle:
dependencies {
......
implementation "io.reactivex.rxjava2:rxjava:2.2.3"
implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
}
RxAndroid: RxJava 在Android 平台的扩展, 里面有Android 相关的一些工具 .
- 使用:
最基本的需要3步:
- 创建观察者(Observer)
- 创建被观察者(Observable)
- 订阅(Subscribe)
有没有很眼熟! 观察者模式么不就是! 对,就酱!
开始操刀!!!!
1. 创建观察者(Observer)
Observer
其中有一个Disposable的对象,用来解除订阅,只要在想要的位置添加
disposable.dispose();
就可以了.
2. 创建被观察者(Observable)
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
emitter.onNext("第一个数据");
emitter.onNext("第二个数据");
emitter.onComplete();
}
});
lambda一下:
Observable observable = Observable.create(emitter -> {
emitter.onNext("第一个数据");
emitter.onNext("第二个数据");
emitter.onComplete();
});
这是Observable.create() 添加事件, 还可以用just:
Observable observable1 = Observable.just("第一个数据", "第二个数据");
还可以用 fromArray :
String[] words = {"第一个数据", "第二个数据"};
Observable observable2 = Observable.fromArray(words);
你想要的,我都给你(^3^)
3. 订阅(Subscribe)
这个只要一行代码:
observable.subscribe(observer);
运行结果:
结合
仔细看第三步订阅,不就是 subscribe 把观察者和被观察者连在一起吗.
有了这跟红线,观察者和被观察者快(mei)乐(xiu)幸(mei)福(sao)的在一起后:
Observable.create(emitter ->{
emitter.onNext("第一个数据");
emitter.onNext("第二个数据");
emitter.onComplete();
}).subscribe(new Observer() {
private Disposable disposable;// 用来解除订阅
@Override
public void onSubscribe(Disposable d) {
// 回调方法onSubscribe,传递参数为Disposable ,
// Disposable相当于RxJava1.x中的Subscription,用于解除订阅
disposable = d;
}
@Override
public void onNext(Object o) {
// TODO 观察者普通事件,把要处理的事件添加到事件队列中去
Log.d(TAG, o.toString());
}
@Override
public void onError(Throwable e) {
// TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
Log.d(TAG, e.getMessage());
}
@Override
public void onComplete() {
// TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
Log.d(TAG, "OnComplete");
}
});
好了圆满了,就酱!!
然而
翻了资料看到还有一个问题:
观察者还有一种方式:
Subscriber subscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
//这一步是必须,我们通常可以在这里做一些初始化操作,调用request()方法表示初始化工作已经完成
//调用request()方法,会立即触发onNext()方法
s.request(Long.MAX_VALUE);//这里是请求数量,如果没有要求可以写Long.MAX_VALUE,请求足够多的事件
//在onComplete()方法完成,才会再执行request()后边的代码
}
@Override
public void onNext(String s) {
// TODO 观察者普通事件,把要处理的事件添加到事件队列中去
Log.d(TAG, s);
}
@Override
public void onError(Throwable t) {
// TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
Log.d(TAG, t.getMessage());
}
@Override
public void onComplete() {
// TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
Log.d(TAG, "OnComplete");
}
};
同样的订阅:
observable.subscribe(subscriber);
然后就
没有Subscriber 对象,说好了做彼此的好基友呢?为啥不要我了!!
但是有的时候变的往往是我们自己
上源码大法!
RxJava 1.0
public abstract class Subscriber implements Observer, Subscription {...}
RxJava 2.0
public interface Subscriber {...}
RxJava 2.0 已经按照Reactive-Streams specification规范完全的重写了。RxJava2.0 已经独立于RxJava 1.x而存在。还想着向下兼容的好事儿呢?!呵呵~~~
那么我Subscriber 就孤独没人要了吗?当让不是.
在RxJava2.0中增加被观察者的新实现:Flowable 而且支持背压呀有木有!
具体的使用和 Observable Observer的组合基本一样:
//观察者
ResourceSubscriber subscriber = new ResourceSubscriber() {
@Override
public void onStart() {
request(Long.MAX_VALUE);//这里是请求数量,如果没有要求可以写Long.MAX_VALUE,请求足够多的事件
}
@Override
public void onNext(String s) {
// TODO 观察者普通事件,把要处理的事件添加到事件队列中去
Log.d(TAG, s);
}
@Override
public void onError(Throwable t) {
// TODO 异常事件,当发生异常时调用,同时队列终止,不再发出事件
Log.d(TAG, t.getMessage());
}
@Override
public void onComplete() {
// TODO 队列事件结束,当队列中不再有新的事件产生时,触发,作为结束标志
Log.d(TAG, "OnComplete");
}
};
//可观察者,和被观察者一样的
Flowable flowable = Flowable.create((FlowableOnSubscribe) emitter -> {
emitter.onNext("第一个数据");
emitter.onNext("第二个数据");
emitter.onComplete();
}, BackpressureStrategy.BUFFER);// 多了一个参数
//订阅
flowable.subscribe(subscriber);
//取消订阅
subscriber.dispose();
然后看一眼ResourceSubscriber是啥:
public abstract class ResourceSubscriber implements FlowableSubscriber, Disposable {....}
再看一眼FlowableSubscriber :
public interface FlowableSubscriber extends SubscSriber {...}
看到没! 我Subscriber! 穿上美丽的裙子,变成了ResourceSubscriber!!!嫁给了王子!!!(总觉得哪里不对...Observable 和 SubscSriber是曾经的基友...穿裙子...嫁给王子...)理不清了,不管了!
只是想说一句,现在的搜索引擎...emmmm...优秀!!!!
上面就是最基本的RxJava的使用了,后续再学习再更新!!!
(某大神: 这么简单的东西也要写hetui~)