我正在使用Retorfit
+ RxJava2
网络,我想缓存响应30秒。间隔30秒后进行的任何呼叫应从服务器获取最新结果。我尝试使用Replay
运营商来完成此操作,但每次我呼叫订阅时仍会进行网络呼叫。我不是RxJava的专家,所以也许我对使用Replay
进行缓存的理解是错误的。缓存使用RxJava一段时间的网络调用
public Observable<Name> getName() {
return retrofitBuilder.getName()
.subscribeOn(Schedulers.io())
.replay(30, TimeUnit.SECONDS,Schedulers.io())
.autoConnect();
}
,我致电上述这样的代码:
service.getName()
.subscribe(new Consumer<Name>()
{
@Override
public void accept(Name name) throws Exception
{
Log.d("getName", "Name: " + name.toString());
}
}
, new Consumer<Throwable>()
{
@Override
public void accept(Throwable throwable) throws Exception
{
Log.d("getName", throwable.getMessage());
}
});
UPDATE:我的道歉,如果我没有解释清楚我的问题。我想要的是缓存一个特定的请求,而不是缓存在HttpClient
级别,它将缓存策略应用于所有通过它的请求。最后,我想在需要时为不同的请求定义不同的缓存过期。并非我所有的请求都需要缓存很长时间。我想知道我能否做到这一点。
感谢您的帮助。
每次调用'service.getName()'都会返回一个新的'Observable'。这个“重放”操作符以及其他类似的操作符意味着允许在单个Observable上进行多种多播。最有可能的是,你希望在'service.getName()'方法的后面实现缓存,这样它将提供缓存功能,无论你创建多少个独立的Observable运行它。这可能意味着你使用“Cache-Control”或其他方法在Http客户端层实现缓存。 – drhr
一个解决方案是仅为该呼叫使用不同的okhttp客户端/拦截器。 – parkgrrr