ReactiveX 学习笔记(36)Single, Maybe, Completable
概述
Single, Maybe, Completable 都是可观察的数据流 Observable 的变体。
- Observable
发送0个,1个或多个数据(Next),最后以出错(Error)或完成(Complete)事件收尾。
出错或完成事件可以不出现,但是出错或完成事件之后不可再发送数据。 - Single
成功发送1个数据(Success),或者出错(Error)。 - Maybe
成功发送1个数据(Success),或者出错(Error)或完成(Complete)。 - Completable
出错(Error)或完成(Complete)。
与Observable 有所不同,这些变体最多只发送一个数据。
RxJava,RxSwift 实现了这些变体。
Rx.NET, RxJS 没有实现这些变体,只能使用 Observable。
观察者接口
public interface Observer<@NonNull T> {
void onSubscribe(@NonNull Disposable d);
void onNext(@NonNull T t);
void onError(@NonNull Throwable e);
void onComplete();
}
public interface SingleObserver<@NonNull T> {
void onSubscribe(@NonNull Disposable d);
void onSuccess(@NonNull T t);
void onError(@NonNull Throwable e);
}
public interface MaybeObserver<@NonNull T> {
void onSubscribe(@NonNull Disposable d);
void onSuccess(@NonNull T t);
void onError(@NonNull Throwable e);
void onComplete();
}
public interface CompletableObserver {
void onSubscribe(@NonNull Disposable d);
void onComplete();
void onError(@NonNull Throwable e);
}
事件对照表
Success | Error | Complete | |
---|---|---|---|
Single | 🟠 | 🟠 | ❌ |
Maybe | 🟠 | 🟠 | 🟠 |
Completable | ❌ | 🟠 | 🟠 |
功能对照表
0个数据 | 1个数据 | 多个数据 | 出错 | 完成 | |
---|---|---|---|---|---|
Observable | 🟠 | 🟠 | 🟠 | 🟠 | 🟠 |
Single | ❌ | 🟠 | ❌ | 🟠 | ❌ |
Maybe | 🟠 | 🟠 | ❌ | 🟠 | 🟠 |
Completable | 🟠 | ❌ | ❌ | 🟠 | 🟠 |
Single, Maybe, Completable 的具体功能均可通过 Observable 来实现,但使用这些变体可以使意图明确化。
使用场景
Single: REST API 中的 GET
Maybe: 可能被取消的 Single
Completable: REST API 中的 PUT,不产生返回值的 Task
interface RestPost {
@GET
fun getPostAsString(@Url url: String): Single<String>
@GET("posts/{id}")
fun getPostAsJson(@Path("id") id: Int): Single<Post>
}
类型对照表(Kotlin)
异步类型 | 同步类型 |
---|---|
Observable<String> |
List<String> |
Single<String> |
String |
Maybe<String> |
String? |
Completable |
Unit |