You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:57:36