Android Retrofit POST请求缓存

时间:2016-08-19 13:51:58

标签: android retrofit

哪种方法可以存储改造 POST请求缓存?

我会在用户离线时存储响应并使用该响应。我被引用这个链接。
1)Can Retrofit with OKHttp use cache data when offline
2)Cache POST requests with OkHttp

但是在这个链接缓存机制中只能使用GET方法 - 可以使用改造在后期请求中存储缓存吗?
- 是否有任何库来处理网络缓存?

由于

2 个答案:

答案 0 :(得分:2)

OkHttp支持文件缓存

答案 1 :(得分: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请求时订阅,我们希望它等待并且不执行请求两次,除非正在进行的请求失败。为此,信号量允许单个访问创建或返回高速缓存的observable的块,如果创建了一个新的observable,我们将等到那个终止。