Android-MVVM之快速上手Rxjava
什么是Rxjava?
一句话
异步
。通过Rxjava能优雅(链式编程)的解决异步
问题
Rxjava的使用
首先是观察者模式,其次记住四个点就会使用。
被观察者 (Observable)
观察者 (Observer)
订阅(Subscribe)
事件(Event)
// 简单的demo----分步骤实现,一般来说开发的时候不会这么写
// 第一步:被观察者
Observable<String> myObservable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
//ObservableEmitter有三种结果onNext()、onComplete()、onError()
//onNext()发送事件,可以无限调用。
emitter.onNext("1111");
emitter.onNext("2222");
emitter.onNext("3333");
//onComplete()、onError()是互斥的,观察者只会收到一个
//onComplete()完成事件发送,可以重复调用,但是观察者只会接收一次
emitter.onComplete();
//onError()异常发送,不可以重复调用
//emitter.onError(new IllegalArgumentException("Exception!"));
}
});
//第二步: 观察者
Observer<String> Observer = new Observer<String>() {
//定义Disposable类变量
private Disposable mDisposable;
//事件队列开始
@Override
public void onSubscribe(@NonNull Disposable d) {
//Disposable可以当作订阅关系
//当订阅时被调用
Log.e("RxJava_TAG", "onSubscribe");
mDisposable = d;
}
//普通事件
@Override
public void onNext(@NonNull String s) {
//发送数据时被多次调用
Log.e("RxJava_TAG", "onNext" + s);
//取消/解除订阅实例
if ("2222".equals(s)) {
// 取消订阅,那么3333就接受不到了
mDisposable.dispose();
Log.d("RxJava_TAG", "是否已经切断了连接:" + mDisposable.isDisposed());
}
// 常用api如下:
//取消/解除订阅
//d.dispose();
//是否已经解除订阅
//d.isDisposed();
}
//事件队列异常事件
@Override
public void onError(@NonNull Throwable e) {
//在事件处理过程中出现异常时,onError()方法会被触发
Log.e("RxJava_TAG", "onError");
}
//事件队列完结事件
@Override
public void onComplete() {
//RxJava把所有事件都当作队列处理
//当被观察者不再发送onNext()普通事件的时候
Log.e("RxJava_TAG", "onComplete");
}
};
// 第三步:建立订阅关系
myObservable.subscribe(Observer);
// 常用的写法是:
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
emitter.onNext("1111");
emitter.onNext("2222");
emitter.onNext("3333");
emitter.onComplete();
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("RxJava_TAG", "onSubscribe");
}
@Override
public void onNext(@NonNull String s) {
Log.e("RxJava_TAG", "onNext" + s);
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("RxJava_TAG", "onError");
}
@Override
public void onComplete() {
Log.e("RxJava_TAG", "onComplete");
}
});
}