温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

rxjava怎么实现缓存

发布时间:2026-09-20 14:57:22 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 RxJava 里“实现缓存”常见有几种思路,取决于你是想:

  1. 内存缓存(避免重复请求)
  2. 磁盘 / 网络缓存(类似 HTTP 缓存)
  3. 对同一个 Observable 做结果复用

下面按常见场景给你讲几种实战做法。


一、最简单:用 cache()(推荐)

场景

一个接口只请求一次,多个订阅者共享结果。

Observable<User> userObservable = api.getUser()
        .cache(); // 只请求一次,后续直接复用

userObservable.subscribe(u -> Log.d("A", u.name));
userObservable.subscribe(u -> Log.d("B", u.name));

✅ 优点

  • 自动缓存结果
  • 只执行一次 subscribe

❌ 缺点

  • 进程杀掉就没了
  • 没有过期时间

二、手动内存缓存(Map + Observable)

场景

按 key 缓存,比如用户 ID

Map<String, Observable<User>> cache = new HashMap<>();

public Observable<User> getUser(String id) {
    if (!cache.containsKey(id)) {
        cache.put(id, api.getUser(id)
                .doOnNext(user -> saveMemory(user))
                .cache());
    }
    return cache.get(id);
}

✅ 适合

  • 列表 + 详情
  • 多次进入同一页面

三、使用 replay()(带时间缓存)

Observable<User> observable = api.getUser()
        .replay(1, TimeUnit.MINUTES)
        .autoConnect();

✅ 特点

  • 1 分钟内复用
  • 超过时间重新请求

四、结合 Room / Disk 的缓存(真实项目常用)

思路

  1. 先读缓存
  2. 缓存为空 → 网络
  3. 网络结果 → 存缓存
Observable<User> getUser(String id) {
    return db.getUser(id)              // 磁盘
            .switchIfEmpty(
                api.getUser(id)         // 网络
                    .doOnNext(db::save)
            );
}

✅ 这是 MVVM + RxJava 最常用结构


五、使用 concat + firstElement(先缓存后网络)

Observable<User> cache = db.getUser(id);
Observable<User> network = api.getUser(id)
        .doOnNext(db::save);

Observable.concat(cache, network)
        .firstElement()
        .toObservable();

✅ 特点

  • 快(先用缓存)
  • 数据新(网络兜底)

六、使用 Single + Retrofit + Http 缓存(系统级)

如果你是指 HTTP 缓存:

OkHttpClient client = new OkHttpClient.Builder()
        .cache(new Cache(context.getCacheDir(), 10 * 1024 * 1024))
        .build();

Retrofit + RxJava 直接生效。


七、总结选型

需求 推荐方式
只请求一次 cache()
按 key 缓存 Map + cache
定时失效 replay(time)
离线可用 Room + RxJava
HTTP 缓存 OkHttp Cache

如果你愿意,可以告诉我:

  • 用的是 RxJava2 还是 3
  • 缓存的是 接口 / 图片 / DB
  • 是否结合 Retrofit / Room

我可以直接给你完整可复制代码。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手