理解RxJava里Observables的相关类型

Observable — Operator — Observer

Observable,可观察者,它就好像扬声器一样,做一些处理后发射出一些值。

Operator,操作符,它就像翻译员那样将数据从一种形式翻译/修改为另一种形式。

Observer,观察者,它获得那些由可观察者发射出来的或者有操作符转译的值。

它们的关系如图:

RxJava可观察类型

在RxJava的可观察类型如下:

  • Observable
  • Flowable
  • Single
  • Maybe
  • Completable

RxJava也提供了不同类型的观察者(Observer)对应于不同的可观察类型相:

  • Observer
  • SingleObserver
  • MaybeObserver
  • CompletableObserver

Observable <> Observer

最简单的Observable就是让它发射多个值。

示例:假设正在下载文件,它需要给出当前下载进度的百分比。这种情况我们就需要发射多个值。

创建一个简单的Observable

Observable<Integer> getDownloadObservable(final String url) {
return Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> emitter) {
if(!emitter.isDisposed()) {
emitter.onNext(10);
}
if(!emitter.isDisposed()) {
emitter.onNext(50);
}
if(!emitter.isDisposed()) {
emitter.onNext(75);
}
if(!emitter.isDisposed()) {
emitter.onNext(100);
emitter.onCompleted();
}
}
});
}

Observable对应的Observer

Observer<Integer> getObserver() {
return new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Integer value) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onCompleted() {
}
};
}

Flowable <> Observer

当Observable发射了大量的值,而Observer处理不了那么多的值时,就可以用到Flowable。

这种情况下,Observable需要根据一些策略来跳过一些值,否则它会抛出异常。

可观察类型Flowable会使用策略来处理异常。

策略称为BackPressureStrategy(背压策略),异常为MissingBackPressureException(缺失背压异常)。

创建可观察的Flowable和Observer

和Observable类似,可以使用Flowable.create()来创建Flowable。与Flowable对应的Observer和上面的例子一样。

Single <> SingleObserver

Observable发射单值时使用Single。创建一个Single如下:

Single<String> getSingleObservable() {
return Single.create(new SingleOnSubscribe<String>() {
@Override
public void subscribe(SingleEmitter emiiter) {
if(!emitter.isDisposed()) {
emitter.onSuccess("Hello");
}
}
});
}

与Single对应的SingleObserver

SingleObserver<String> getSingleObserver() {
return new SingleObserver<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onSuccess(String value) {
}
@Override
public void onError(Throwable e) {
}
};
}

Maybe <> MaybeObserver

当Observable会发射一个值或者不会发射值,这时可以用到Maybe,创建Maybe如下:

Maybe<String> getMaybeObservable() {
return Maybe.create(new MaybeOnSubscribe<String>() {
@Override
public void subscribe(MaybeEmitter emiiter) {
if(!emitter.isDisposed()) {
emitter.onSuccess("Hello");
}
}
});
}

与Maybe对应的MaybeObserver

MaybeObserver<String> getMaybeObserver() {

return new MaybeObserver<String>() {

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onSuccess(String value) {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onComplete() {

}

};

}

Completable <> CompletableObserver

当Observable需要处理一些任务当并没有发射任何值,这时可以用到Comletable。

创建Completable

Completable getCompletableObservable() {
return Completable.create(new CompletableOnSubscribe() {
@Override
public void subscribe(CompletableEmitter emiiter) {
if(!emitter.isDisposed()) {
emitter.onComplete();
}
}
});
}

对应的CompletableObserver

CompletableObserver getCompletableObserver() {
return new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onCompleted() {
}
};
}

版权声明:著作权归作者所有。

相关推荐

理解React Native的Props和State

Props和State是React Native分别用来控制组件中两种不同类型的数据。Propsprops是Properties的简写,称为属性。props的特点是在组件内它是不可变,或者说不能被修改。在React数据流是单向的,从父组件到子组件的方向传递。props就是组件从父组件接收的数据,在组件内部是不能对它修改。props不可变的特性是有助于我们写可复用的组件。我们只需要对一个组

理解JavaScript普通函数以及箭头函数里使用的this

this普通函数的this普通函数的this是由动态作用域决定,它总指向于它的直接调用者。具体可以分为以下四项:this总是指向它的直接调用者, 例如 obj.func() ,那么func()里的this指的是obj。在默认情况(非严格模式,未使用 'use strict'),如果函数没有直接调用者,this为window在严格模式下,如果函数没有

Python:有关IntEnum类型的比较

枚举类型的使用请参考:Python3.4 枚举类型的使用。我们在使用Enum定义枚举类型,枚举的成员不是整型,所以在做比较时不能使用如大于号(">"),小于号(“<”)作比较。只用做相等性比较。但直接和整型做相等比较,结果都为False。Python新增了IntEnum,IntEnum是允许和整型做比较,包括大小比较和值得相等比较。创建IntEnum定义I

理解Java的数字溢出

Java各个数字类型所占的存储空间:整型byte:1字节,1*8bit,取值范围-128~127short:2字节,2*8bit,取值范围-32768~32767int:4字节,4*8bit,取值范围-2147483648~2147483647long:8字节,8*8bit,取值访问-2^64~2^64-1浮点型float:4字节,4*8bitdouble:8字节,8*8bitchar类型java

Android Studio 3内置支持Java 8的相关配置

Android Studio 3开始支持Java 7全部的特性,以及内置支持Java 8部分特性。原理Android Studio 3支持Java 8做法是使用称为desugar工具把javac编译后的.class做字节转换,转换为新的.class文件,最后使用dex转换为dex文件。配置Android Studio&

Kotlin:基本类型 - 数值

内置数值类型Kotlin和Java的数值类型很接近,内置了6中数值类型:Double:64 Float:32 Long:64 Int:32 Short:16 Byte:8 在Java里,char类型也是一种数值类型,可以和其他数值类型转换,而在Kotlin则没有把char类型作为数值类型。字面量整数整数类型:Shot,Int和Long。和Java一样,Long类型的字面量在数字后面加上L来表示。&