一、一句话定义
Maybe 是 RxJava 3 里的被观察者(上游)三种结果只会触发其中一种:
- 发送一个数据
- 发送完成(无数据)
- 发送异常
可以理解为:有可能有值,有可能没值,有可能出错,所以叫 Maybe(也许、可能)
接口源码本质
java
运行
public interface MaybeSource<T> {
void subscribe(MaybeObserver<? super T> observer);
}
泛型 <T>:你要返回的数据类型
二、和 Rx 另外三个最容易混淆的对比(必背)
你项目里肯定经常见这四个,我一次性分清:
- Observable可以发 0~N 个数据(多次发送)
- Single****必须发 1 个数据 或者 异常
- Completable****不发任何数据,只通知完成 / 异常
- Maybe****要么 1 个数据,要么完成(无数据),要么异常= Single + Completable 结合体
| 类型 | 能返回数据? | 数量 |
|---|---|---|
| Observable | 是 | 多个 |
| Single | 是 | 有且仅有 1 个 |
| Completable | 否 | 0 个,只完成 |
| Maybe | 可能有,可能没有 | 0 个 或 1 个 |
三、基础完整用法(Java 版,最简单示例)
1. 创建 Maybe
java
运行
Maybe<String> maybe = Maybe.create(emitter -> {
// 发送一个数据
emitter.onSuccess("数据");
// 或者 不发数据,直接完成
// emitter.onComplete();
// 或者 发送异常
// emitter.onError(new Exception("出错"));
});
2. 订阅(接收结果)
java
运行
maybe.subscribe(
// 1. 成功并且有数据
data -> {
// 拿到数据
},
// 2. 异常回调
error -> {
// 出错了
},
// 3. 完成回调(没有数据时走这里)
() -> {
// 无数据,执行完成逻辑
}
);
极简 Lambda 写法(项目里最常见)
java
运行
maybe.subscribe(
value -> {}, // 有值
throwable -> {},// 异常
() -> {} // 无值完成
);
四、你 Android 项目里,Maybe 一般用来干嘛?
结合你之前所有知识点:ARouter 获取服务、SP/MMKV 取值、数据库查询、接口请求、页面数据、缓存读取
非常典型场景:
我去拿一个数据有可能拿到,有可能为空,有可能请求出错
完美适配 Maybe比如:
java
运行
Maybe<UserInfo> getUserInfo();
- 有用户信息 → onSuccess
- 没登录 / 没数据 → onComplete
- 网络异常、解析失败 → onError
比 Single 灵活,比 Observable 严谨(不会多次回调)。
五、常用操作符(项目高频)
1. 切换线程(Android 必用)
java
运行
Maybe.create(...)
.subscribeOn(Schedulers.io()) // 上游在IO线程执行
.observeOn(AndroidSchedulers.mainThread()) // 下游回调主线程
2. 空值默认值
java
运行
// 如果没有数据(走onComplete),给一个默认值
maybe.defaultIfEmpty("默认值")
3. 转换数据 map
java
运行
maybe.map(data -> new Bean(data))
4. 过滤
java
运行
maybe.filter(value -> value != null)
七、终极精简总结(面试 + 理解背诵版)
-
Maybe = RxJava 被观察者
-
事件只有三种结局 三选一:
onSuccess(T):有1 个数据onComplete():无数据,正常结束onError():异常
-
适用场景:查询、获取数据、读取缓存、跨模块拿服务结果不确定(有值 / 空 / 异常)
-
区别:
Single必须有值Completable完全无值- Maybe 二者结合,最灵活
-
回调三个参数:有值、异常、无值完成
八、额外提醒(极易踩坑)
很多人分不清:
onComplete和onSuccess只会走一个- 一旦走了
onSuccess,就不会走 onComplete - 只有全程没发送任何数据,才会走
onComplete