Android RxJava:解决向Single.just()传入可空对象的空指针问题
RxJava处理Retrofit空Data的解决方案
核心问题原因
RxJava的Single规范不允许直接发射null值,调用Single.just(null)会直接触发NullPointerException——这就是你遇到问题的根源。同时上层要求必须返回Single类型,不能改用Maybe,所以得从Single的特性出发找解决办法。
可行方案
方案1:用包装类封装可空数据
既然Single不能直接发null,可以用简单的包装类把可空数据包起来,上层再按需解析:
// 自定义可空数据包装类 data class NullableData<T>(val value: T?) // Single扩展函数 fun <T> Single<ApiResponse<T>>.handleResponse(): Single<NullableData<T>> { return this.map { response -> // 先统一处理event逻辑 processEvent(response.event) // 把data包装后返回,不管是否为null NullableData(response.data) } }
调用时直接从NullableData里取value即可,空值也能正常接收。
方案2:用Single.fromCallable延迟发射空值
在Kotlin环境下,利用fromCallable的延迟执行特性,可以绕过Single.just的即时空值校验:
fun <T> Single<ApiResponse<T>>.handleResponse(): Single<T?> { return this.flatMap { response -> // 处理event逻辑 processEvent(response.event) // 用fromCallable延迟返回data,允许null Single.fromCallable { response.data } } }
fromCallable会在订阅时才执行返回逻辑,不会像just那样立即校验参数,因此可以正常返回null,适配Single<T?>的返回类型。
方案3:终止请求(转为错误或返回默认值)
如果希望data为空时直接终止请求处理:
- 触发错误通知:
fun <T> Single<ApiResponse<T>>.handleResponse(): Single<T> { return this.map { response -> processEvent(response.event) // data为空时抛出自定义错误,上层订阅时处理 response.data ?: throw ApiDataEmptyException("API返回数据为空") } }
- 返回默认空对象(适配
Single必须发射值的要求):
fun <T> Single<ApiResponse<T>>.handleResponse(defaultValue: T): Single<T> { return this.map { response -> processEvent(response.event) response.data ?: defaultValue } }
内容的提问来源于stack exchange,提问作者eoinzy
相关产品推荐
相关产品推荐

