欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)

程序员文章站 2022-07-09 18:21:58
OkHttp的缓存问题1.使用背景2.错误代码示例3.正解4.总结1.使用背景最近在搞项目,我用的是Retrofit,但考虑到市面上大多用了缓存机制,于是我又封装了一个OkHttpClient,几经波折,程序能跑起来了。但我发现它从未访问过内存,一直是在进行网络请求。2.错误代码示例如果认为自己的缓存有问题,可以看一下这篇博客链接: Android okhttp缓存正确的实现方式.我先把我最初的代码贴出来,看大家能不能发现错误。(1).(2).(3).一开始遇到这个错误,我以为可...

1.使用背景

最近在搞项目,我用的是Retrofit,但考虑到市面上大多用了缓存机制,于是我又封装了一个OkHttpClient,几经波折,程序能跑起来了。但我发现它从未访问过内存,一直是在进行网络请求。

2.错误代码示例

如果认为自己的缓存有问题,可以看一下这篇博客
链接: Android okhttp缓存正确的实现方式.
我先把我最初的代码贴出来,看大家能不能发现错误。
(1).
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)
(2).
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)
(3).
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)一开始遇到这个错误,我以为可能是自己的拦截器有问题,尽管它是对的
我就是怀疑这里,因为感觉只有这里会出问题,检查了几遍之后,确定它没得问题
此时的我心态炸裂,那我认为就只可能是自己的代码逻辑有问题了。
检查逻辑是否出问题了,那我怎么查呀, 都没有报错信息,欸,想到这里,我的内心…
当时我就不乐意了,直接跑去打游戏去了,因为我感觉无从下手
后来的后来,我仔细想了一下,因为用的是MVP架构,我认为应该是逻辑层的执行顺序有问题,但我感觉不太可能,毕竟在有网络时,我是访问到了数据,按理来说,有网,和无网差不多是等效的,谷歌百度都查了,但并不是我想要的那个。
既然网上都没有我想要的那个答案,那么就应该是有一个很细节的地方没注意,那么应该是我封装的问题了。

3.正解

我直接把自己有关Retrofit的封装有写了一遍,这次我发现问题了,可能这个问题大家都没遇到过,真坑。
先上结论吧!
是在OkHttpClient的封装时出了问题,访问不到这个路径下的缓存

File file = new File(Environment.getDownloadCacheDirectory(), “cache”);

正确的封装如下

/**
     * 初始化OkHttpClient
     */
    private void initOkHttp() {
        //File file = new File(Environment.getDownloadCacheDirectory(), "cache");
        File file = new File(Environment.getExternalStorageDirectory(), "cache2");
        int cacheSize = 10 * 1024 * 1024;
        Cache cache = new Cache(file, cacheSize);
        mClient  = new OkHttpClient.Builder()
                .cache(cache)
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(new LoggingInterceptor())
                .addInterceptor(OfflineInterceptor.getInstance())
                .addNetworkInterceptor(OnlineInterceptor.getInstance())
                .build();
    }

哈哈哈哈哈哈哈哈哈哈哈,看出来和上面的代码有啥不同的吗?
就是这两个路径不同而已

		File file = new File(Environment.getDownloadCacheDirectory(), "cache");
        File file = new File(Environment.getExternalStorageDirectory(), "cache2");

4.总结

至于这个路径(File file = new File(Environment.getDownloadCacheDirectory(), "cache"))为什么不行,我也不知道,望有明白的大佬解释下。
至于我怎么写了这个路径的:
就是。。。。它不是说缓存吗?我想都没想,那肯定是和cache有关的路径啊!我当时是这么写的
关于Okhttp缓存的“万种死法”,我get到了一种,HTTP 504 Unsatisfiable Request (only-if-cached)然后,就那样了,红红火火恍恍惚惚,哈哈哈哈哈哈哈哈

但就是这么一个小小的错误,我就搞了几天,曾一度自闭!!!!!!!

本文地址:https://blog.csdn.net/zk2000416/article/details/107379178