zwvista

导航

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

posted on 2021-07-24 13:37  zwvista  阅读(300)  评论(1编辑  收藏  举报