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

如何将Completable与Observable结合?改造现有数据流加载逻辑

解决方案

要在不改动原有天气数据流逻辑的前提下,实现订阅Observable时自动执行缓存API(Completable),可以根据你的实际需求选择以下两种方案:

方案一:订阅时异步执行缓存操作(不阻塞数据流)

如果不需要等待缓存操作完成就发射天气数据,推荐使用doOnSubscribe操作符——它会在Observable被订阅时触发一次缓存API调用,完全不影响原有数据流的发射时机和内容:

fun fetchWeather(): Observable<Weather> {
    return weatherObservable
        .startWithItem(/* Weather Object */)
        .doOnSubscribe {
            // 订阅时执行缓存操作,可添加错误回调处理异常
            hasWeatherFetched().subscribe(
                {}, 
                { error -> 
                    // 处理缓存操作的异常,比如打印日志
                    Log.e("WeatherCache", "缓存操作失败", error) 
                }
            )
        }
}

如果缓存操作需要在特定线程执行(比如IO线程),可以给Completable指定线程调度:

fun fetchWeather(): Observable<Weather> {
    return weatherObservable
        .startWithItem(/* Weather Object */)
        .doOnSubscribe {
            hasWeatherFetched()
                .subscribeOn(Schedulers.io()) // 在IO线程执行缓存操作
                .observeOn(AndroidSchedulers.mainThread()) // 可选:回调到主线程处理结果
                .subscribe({}, { error -> Log.e("WeatherCache", "缓存失败", error) })
        }
}

方案二:等待缓存完成后再发射天气数据

如果要求必须先完成缓存操作,再发射天气数据,可以用andThen将Completable和原有Observable串联:

fun fetchWeather(): Observable<Weather> {
    // 先执行缓存操作,完成后再发射原有天气数据流
    return hasWeatherFetched()
        .andThen(weatherObservable.startWithItem(/* Weather Object */))
}

注意:这个方案会改变原有逻辑——原来的startWithItem会立即发射数据,现在要等缓存操作完成后才会发射,适合必须依赖缓存完成的场景。

内容的提问来源于stack exchange,提问作者Hack123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:33:18