安卓Retrofit POST请求缓存

6

1
可能或不可能,POST请求旨在更改服务器中的数据,您确定要将它们缓存吗? - lelloman
嗨 @lelloman ,对于我的情况,当用户离线时,我将从缓存中获取响应。 - Mitesh Vanaliya
2个回答

2

OkHttp支持文件缓存


4
OKHttp不支持对POST请求进行缓存,仅支持GET请求。 - galaxigirl

0

这是我们最终得出的解决方案

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();
    }
}

我们需要缓存来自Retrofit的HTTP请求结果。因此,创建了一个可观察对象,它以发出单个项目为目标。
如果在执行HTTP请求时订阅了观察者,我们希望它等待而不是执行两次请求,除非正在进行的请求失败。为了做到这一点,信号量允许单个访问创建或返回缓存可观察对象的块,并且如果创建了新的可观察对象,则等待直到该对象终止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接