在 RxJava 里“实现缓存”常见有几种思路,取决于你是想:
下面按常见场景给你讲几种实战做法。
cache()(推荐)一个接口只请求一次,多个订阅者共享结果。
Observable<User> userObservable = api.getUser()
.cache(); // 只请求一次,后续直接复用
userObservable.subscribe(u -> Log.d("A", u.name));
userObservable.subscribe(u -> Log.d("B", u.name));
✅ 优点
subscribe❌ 缺点
按 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();
✅ 特点
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 |
如果你愿意,可以告诉我:
我可以直接给你完整可复制代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。