如何最好地存储 retrofit 的POST请求缓存?
我想在用户离线时存储响应,并使用该响应。我被引用了这个链接。
1)可以在离线情况下使用缓存数据来使用Retrofit和OKHttp吗?
2)使用OkHttp缓存POST请求
但是,在此链接中,缓存机制仅适用于GET方法。
- 是否可以使用retrofit在post请求中存储缓存?
- 有没有处理网络缓存的库?
谢谢
如何最好地存储 retrofit 的POST请求缓存?
我想在用户离线时存储响应,并使用该响应。我被引用了这个链接。
1)可以在离线情况下使用缓存数据来使用Retrofit和OKHttp吗?
2)使用OkHttp缓存POST请求
但是,在此链接中,缓存机制仅适用于GET方法。
- 是否可以使用retrofit在post请求中存储缓存?
- 有没有处理网络缓存的库?
谢谢
OkHttp支持文件缓存
这是我们最终得出的解决方案
public class OnErrorRetryCache<T> {
public static <T> Observable<T> from(Observable<T> source) {
return new OnErrorRetryCache<>(source).deferred;
}
private final Observable<T> deferred;
private final Semaphore singlePermit = new Semaphore(1);
private Observable<T> cache = null;
private Observable<T> inProgress = null;
private OnErrorRetryCache(Observable<T> source) {
deferred = Observable.defer(() -> createWhenObserverSubscribes(source));
}
private Observable<T> createWhenObserverSubscribes(Observable<T> source)
{
singlePermit.acquireUninterruptibly();
Observable<T> cached = cache;
if (cached != null) {
singlePermit.release();
return cached;
}
inProgress = source
.doOnCompleted(this::onSuccess)
.doOnTerminate(this::onTermination)
.replay()
.autoConnect();
return inProgress;
}
private void onSuccess() {
cache = inProgress;
}
private void onTermination() {
inProgress = null;
singlePermit.release();
}
}