HttpResponseCache 在 Android Lollipop 中不起作用

2023-12-01

我一直在我的应用程序中成功使用 HttpResponseCache,但是当我的手机更新到 Lollipop 时,我意识到 HttpResponseCache 现在永远不会被“命中”,总是执行网络请求。我已经确认 Lollipop 之前的 Android 版本仍然运行良好。 也许这是我做错的事情,随着新的 Android 更改,它已经出现了。

有人有什么想法吗?

My code:

应用程序类,onCreate...

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        try {
            File httpCacheDir = new File(getApplicationContext().getCacheDir()
                    , "http");
            long httpCacheSize = 10 * 1024 * 1024;
            HttpResponseCache.install(httpCacheDir, httpCacheSize);
        } catch (IOException e) {
            Log.i(TAG, "HTTP response cache installation failed:" + e);
        }
    } else {
        try {
            File httpCacheDir = new File(getCacheDir(), "http");
            long httpCacheSize = 10 * 1024 * 1024;
            Class.forName("android.net.http.HttpResponseCache")
                    .getMethod("install", File.class, long.class)
                    .invoke(null, httpCacheDir, httpCacheSize);
        } catch (Exception e) {
                Log.i(TAG, "HTTP response cache installation failed:" + 
        }
    }

管理请求的功能

public static InputStream fetchInputStream(String strURL, boolean forceRefresh)
        throws IOException {

    HttpURLConnection mHttpConn = null;
    InputStream inputStream = null;
    URL url = new URL(strURL);
    HttpResponseCache cache;

    try {
        mHttpConn = (HttpURLConnection) url.openConnection();

        if (forceRefresh) {
            mHttpConn.addRequestProperty("Cache-Control", "no-cache");
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            cache = HttpResponseCache.getInstalled();
            if (cache != null) {

                    Log.i("TEST CACHE", "TEST PETICION: Req count: "
                            + cache.getRequestCount() + ", hit count "
                            + cache.getHitCount() + ", netWork count "
                            + cache.getNetworkCount() + "   size = "
                            + cache.size() + " <-----------------");

            }
        }

        mHttpConn.setUseCaches(true);
        mHttpConn.setDefaultUseCaches(true);
        mHttpConn.setRequestMethod("GET");
        mHttpConn.setConnectTimeout(30000);
        mHttpConn.setReadTimeout(30000);
        mHttpConn.connect();

        if (mHttpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            inputStream = mHttpConn.getInputStream();
        }


    } catch (IOException ex) {
        Log.e("NetworkConnectionManager InputStream", "Exception opening ["
                + strURL + "] ->", ex);
        mHttpConn.disconnect();

        throw ex;
    }

    return inputStream;
}

每次请求后

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        HttpResponseCache cache = HttpResponseCache.getInstalled();

        if (cache != null) {
            cache.flush();
        }
    }

请求标头示例:

  • 缓存控制 → max-age=300
  • 连接→保持活动状态
  • 内容编码 → gzip
  • 内容类型 → application/json;字符集=utf-8
  • 日期 → 2015 年 4 月 8 日星期三 12:37:35 GMT
  • 到期 → 2015 年 4 月 8 日星期三 12:42:35 GMT
  • 最后修改 → 2015 年 4 月 8 日星期三 12:37:35 GMT
  • 服务器→nginx
  • 传输编码 → 分块
  • 变化 → 接受编码
  • X 缓存 → 未命中

遇到这个问题几天后,我遇到了这个问题。它在棉花糖中再次修复。

这是棒棒糖中的一个错误,其中 Vary -> Accept-Encoding 标头会破坏缓存,因为 Accept-Encoding 默认情况下会被填充但不会被写掉。

这是该问题的链接:

https://code.google.com/p/android/issues/detail?id=162475

解决方法是显式设置 Accept-Encoding:

接受编码 -> gzip

or

接受编码->身份

在读取方面,您必须将其添加到输入流的读取中:

String encoding = urlConnection.getHeaderField("Content-Encoding");
boolean gzipped = encoding!=null && encoding.toLowerCase().contains("gzip");
Inputstream inputStream;
if(gzipped)
    inputStream = new GZIPInputStream(urlConnection.getInputStream());
else
    inputstream = urlConnection.getInputStream();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpResponseCache 在 Android Lollipop 中不起作用 的相关文章

  • 如何获取.so文件的依赖项列表?

    假设我有libFoo so为 android arm 编译 我不确定它链接到什么STL实现 有options http developer android com intl ru ndk guides standalone toolchai
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Renderscript 示例构建错误

    所以我想尝试使用 RenderScript 的示例 并在 Eclipse 中导入了 HelloWorld 但它给了我这样的错误 2011 10 25 13 10 48 HelloWorld home mileoresko workspace
  • Android:应用内计费V3超时返回哪个响应码?

    出现网络超时情况时 Google Play 应用内结算服务 ice er V3 将返回哪些响应状态代码 它的所有功能都是统一的吗 我将在这里描述我的发现 我通过拔掉主机插头 在安装了全功能 GP GP Store V3 10 10 GP S
  • 如何在android中设置多个闹钟,在这种情况下最后一个闹钟会覆盖以前的闹钟

    我正在开发一个Android应用程序 用户可以在其中设置提醒时间 但我在以下代码中遇到一个问题 即最后一个警报会覆盖之前的所有警报 MainActivity java public void setreminders DatabaseHan
  • 如何使用 Firebase UI 在 recyclerView 中显示时从 Firebase 数据库中的子级引用父级

    我目前正在引用 quote text 子项 这些数据显示在recyclerview using firebase用户界面 我想获取 quote text 的父名称 如何获取 quote text 孩子的父母姓名 When user clic
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • Android Studio - 值必须 ≥ 0

    我在 Android Studio 中收到与光标有关的错误 我的代码中有以下行 String data cursor getString cursor getColumnIndex columnIndex columnIndex 被传递到该
  • Android 从命令行停止模拟器

    这个问题与如何通过命令行关闭Android模拟器 https stackoverflow com questions 5912403 how to shut down android emulator via cmd 但是 在尝试第一个答案
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 在为 Android 实现 Google 登录时,任务“:app:transformClassesWithDexForDebug”执行失败

    我正在尝试为 Android 实现 Google 登录 并且我正在按照以下说明进行操作 https developers google com identity sign in android start integrating https
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • 在没有 Wifi 的情况下获取 Android 设备的 MAC 地址

    如何获取没有 Wifi 接口的 Android 设备 例如 Android 模拟器 的网络接口的 MAC 地址 通过WifiManager返回获取的WifiInfonull EDIT 更清楚地说 我必须与本地网络上的现有网络协议 不是我设计
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • 如何从 C++ 修改 QML 文本

    我是 Qt 新手 我正在尝试从 C 代码修改 QML 文本 显示在屏幕中 我修改了文本 但屏幕上没有更新它 因此我修改了文本变量 但修改了屏幕上的第一个文本 这是代码 主 cpp include
  • 如何使用 php 将 jpg 图像转换为正确的 blob 数据类型

  • 为什么我不能在 memcpy 中使用 const 参数?

    我有一个struct cVector3d我是memcpy将其放入 char 数组中 如下所示 void insert into stream std ostream stream cVector3d vector int length si
  • Scala 中类型不相等的证据 [重复]

    这个问题在这里已经有答案了 有没有办法限制一个方法 使其只有在证明两种类型时才有意义not平等吗 trait Something A B I can only be called if type A is the same as type
  • 过滤器中的 WQL 不起作用

    我正在尝试做类似的事情 Get WmiObject Win32 NetworkAdapterConfiguration Filter DefaultIPGateway NULL 但我有一个错误 Get WmiObject 无效查询 行 1
  • 单击视图中的计算页面 URL 时打开空白页面(新页面)

    我有以下 viewPanel 我想当用户单击计算出的页面网址时打开一个新页面 我只是似乎不明白这一点
  • sqlite 准备语句错误 - 没有这样的表

    我的 sqlite 准备语句遇到一些困难 我收到一条错误消息 说我的表不存在 尽管我已经在多个地方检查过它 并且它确实存在 所以我很困惑 该文件位于正确的 iPhone Simulator Application 文件夹中 该文件已添加到我
  • PHP,删除 URL 变量的部分[重复]

    这个问题在这里已经有答案了 我有以下 php 变量 currentUrl 这个 php 变量返回我当前的 url 页面 例如 它返回 http example com test category page html ore norn fro
  • C++ 插件:跨边界传递对象(模拟它)

    由于我们不应该跨插件边界传递除普通旧数据结构 1 之外的任何其他内容 因此我想出了以下想法来传递对象 公开插件 C 接口中的所有公共方法 并在应用程序端将插件包装在一个对象中 参见以下示例 我的问题是 有一个更好的方法吗 编辑 请参阅下面我
  • Laravel 控制器子文件夹路由

    我是 Laravel 的新手 为了尝试让我的应用程序保持井井有条 我想将我的控制器放入控制器文件夹的子文件夹中 controllers folder1 folder2 我尝试路由到控制器 但 laravel 找不到它 Route get p
  • 如何从 phantomjs shell 中运行 casper?

    任何人都知道是否以及如何可以从 phantomjs shell 又称为交互模式REPL 我还尝试将直接路径传递给 casper js 模块 但这也不起作用 进展 更新 Tried phantomjs injectJs C casperjs
  • AngularJS $http.post 错误意外的标记 F

    我正在尝试运行我的 http post脚本 我收到错误 我尝试四处搜索 但找不到问题的任何答案 这是我运行网页时收到的错误 XHR finished loading POST http mypage services json DownTi
  • 有没有更好或替代的方法来跳过/避免在 Java 中使用 Thread.sleep(1000) ?

    我正在测试一个重负载的视频 它加载视频并在 Thread sleep 1000 之后加载 它播放第二个视频 但是一旦我循环播放一个又一个 它就会冻结 当我删除所有这些 Thread sleep 1000 时它工作完美 没有冻结 但我需要延迟
  • Pocket PC:将控件绘制到位图

    我尝试使用 C 将控件的实例 例如面板或按钮 绘制到 Pocket PC 应用程序中的位图上 NET 控件具有漂亮的 DrawToBitmap 函数 但 NET Compact Framework 中不存在该函数 我将如何在 Pocket
  • 如何在Python中找到函数对象所需的参数?

    我有一个功能 f def f required arg optional arg None pass 我怎样才能返回一个列表required的参数名称f Using isinstance的结果inspect signature似乎不起作用
  • 是否可以在 MVC 3 中打开/关闭验证数据注释?

    我有两个单独的视图访问同一模型 当我将验证器数据注释放在模型上时 它会按照广告中的方式工作 并且如果留空或不在范围内 则会阻止提交数据 对于两个视图 但是 我有一个视图应该能够允许为属性保存空值或空值 而另一个视图需要要求输入或选择信息才能
  • jQuery 推栈

    我需要一些帮助才能理解pushStack 这里我举了一个例子 使用它和不使用它的结果是一样的http jsfiddle net Bz5n9 2 所以我想我真的不明白它是用来做什么的 Thanks 您当前正在添加到集合中 将一个新集合推送到堆
  • 在 JavaScript 中更改文本框文本

    我允许用户使用两个文本框之一来搜索数据库 一个是 ID 字段 一个是自由文本字段 顺便说一句 我正在使用 ASP NET 和 C 无论如何 我需要做的就是拥有它 这样当用户单击其中一个文本框时 另一个文本框文本就会被删除 因此另一个文本框是
  • CORE DATA objectId 不断变化

    我将一些数据导出到 XML 文件并放入远程 FTP 服务器中 我必须用唯一的属性来标识每个对象 这并不重要 但必须始终持久 gt 它永远不会改变 我不想创建唯一的属性 序列 序列等 我正在使用 objectID 但每次使用它时都会获得一个新
  • HttpResponseCache 在 Android Lollipop 中不起作用

    我一直在我的应用程序中成功使用 HttpResponseCache 但是当我的手机更新到 Lollipop 时 我意识到 HttpResponseCache 现在永远不会被 命中 总是执行网络请求 我已经确认 Lollipop 之前的 An