当前位置: 首页 > 知识库问答 >
问题:

截击解析网络响应

陈坚
2023-03-14

我正在使用截击来管理我的应用程序。有时,当响应很大时,我会在没有太多RAM的设备上获得OOM。我不确定如何解决这个问题。我知道Volley会将其响应存储在内存中,但我的应用程序太多地围绕着Volley,切换起来会很痛苦。我在使用改装时也遇到了问题。我尝试过使用JsonReader,但它似乎仍在发生。我有一个用于截击的自定义请求。它返回一个Gson JsonObject。这是我目前的代码,当响应数据长度返回5511532(5mb)时,应用程序正在接收OOM。

@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
    try {
        String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

        if (LOG_HEADERS) {
            Log.d("GsonResponseHeaders", response.headers.toString());
        }
        if (LOG_JSON) {
            Log.d("GsonRequestResponse", json);
        }

        return Response.success(gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    } catch (OutOfMemoryError e) {
        Log.d("ResponseLength", "-- " + response.data.length);
        return Response.error(new ParseError(e));
    }
}

编辑:

下面是一个引发OOM的示例响应。

[{user_company_info:[{id:1,company_id:5,circle_id:34,状态:A,cat_id:1,company_map:0,时间戳:cat_id,added_by:1,add_date:0000-00-00,circle_name:Cityside-HUD合同区-5D,create_by:2536,create_date:0000-00-00,

编辑:

嘿,伙计们,所以我试着分开我的回答。这似乎有帮助,但在3-4次请求后,它仍然给了我一个空间。我相信这和截击有关。这是我每次回复的GC,它每次都在增长。请注意,堆每次都会增长。我在它们之间留了一些间距,这样你就可以看到堆日志了。

10-12 06:52:21.236 23515-23515/com。机器人。visneta D/RequestQueue:批处理未结订单请求已启动。。。10-12 06:52:21.236 23515-23855/com。机器人。visneta D/GsonCustomHeaders:{UserSession=source=Android-ffffffff-83d1-3e36-ffff-ffff99d603a9,id=6,token=9eb7c26405defb48fe884cfef8000696}10-12 06:52:21.236 23515-23855/com。机器人。visneta I/qtaguid:write_ctrl失败(t-1 4883184842671390720-1)res=-1 errno=9 10-12 06:52:21.236 23515-23855/com。机器人。visneta I/qtaguid:为uid标记为43c48ebe00000000(1136955070)的标记套接字-1失败错误号=-9 10-12 06:52:21.236 23515-23855/com。机器人。visneta I/NetworkManagementSocketTagger:tagSocketFd(-1136955070,-1)失败,错误号为9 10-12 06:52:21.936 23515-23855/com。机器人。visneta I/S。输出:从启用的协议10-12 06:52:21.976 23515-23518/com中删除了SSLv3。机器人。visneta D/dalvikvm:GC_并发释放1990K,15%释放33771K/39495K,暂停11ms 1ms,总计38ms 10-12 06:52:29.940 23515-23855/com。机器人。visneta I/qtaguid:write_-ctrl(u-1)res=-1 errno=9 10-12 06:52:29.940 23515-23855/com失败。机器人。visneta I/qtaguid:取消标记套接字-1失败错误号=-9 10-12 06:52:29.940 23515-23855/com。机器人。visneta W/NetworkManagementSocketTagger:untagSocket(-1)失败,错误号为-9 10-12 06:52:31.808 23515-23855/com。机器人。visneta D/dalvikvm:GC_FOR_ALLOC freed 747K,14%free 34267K/39495K,暂停18ms,总计18ms 10-12 06:52:32.616 23515-23855/com。机器人。visneta D/dalvikvm:GC_FOR_ALLOC freed 596K,12%free 34778K/39495K,暂停21ms,总计21ms 10-12 06:52:32.616 23515-23855/com。机器人。visneta I/dalvikvm堆:对于2093068字节分配10-12 06:52:32.648 23515-23518/com,将堆(frag情况)增长到36.423MB。机器人。visneta D/dalvikvm:GC_并发释放10K,12%释放36811K/41543K,暂停10ms 1ms,总计29ms 10-12 06:52:32.648 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 9ms 10-12 06:52:33.272 23515-23855/com。机器人。visneta D/dalvikvm:GC_FOR_ALLOC freed 1122K,14%free 35790K/41543K,暂停20ms,总计20ms 10-12 06:52:33.272 23515-23855/com。机器人。维斯内塔D/截击:[212]基本网络。logSlowRequests:请求的HTTP响应=

10-12 06:52:33.296 23515-23855/com。机器人。visneta I/dalvikvm堆:将堆(frag情况)增长到38.149MB,用于330504字节分配

10-12 06:52:33.340 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放1K,14%释放38586K/44807K,暂停11毫秒11毫秒,总计43毫秒10-12 06:52:33.392 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放555K,11%释放40078K/44807K,暂停11毫秒0毫秒,总计33毫秒10-12 06:52:33.392 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 9ms 10-12 06:52:33.448 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放558K,8%释放41568K/44807K,暂停11ms 1ms,总计36ms 10-12 06:52:33.448 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 15ms 10-12 06:52:33.504 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放564K,4%释放43050K/44807K,暂停12毫秒1毫秒,总计38ms 10-12 06:52:33.504 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 15ms 10-12 06:52:33.560 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放561K,3%释放44537K/45575K,暂停10ms 1ms,总计38ms 10-12 06:52:33.560 23515-23855/com。机器人。visneta D/dalvikvm:等待并发GC阻塞8ms 10-12 06:52:33.616 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放577K,3%释放46056K/47111K,暂停11毫秒,总计38ms 10-12 06:52:33.624 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 9ms 10-12 06:52:33.676 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放550K,3%释放47555K/48583K,暂停11ms 1ms,总计38ms 10-12 06:52:33.676 23515-23855/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 16ms 10-12 06:52:33.764 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放4602K,11%释放45006K/50119K,暂停11毫秒12毫秒,总计58毫秒10-12 06:52:33.840 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2055K,11%释放44998K/50119K,暂停10ms 0ms,总计45ms 10-12 06:52:33.840 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 26ms 10-12 06:52:33.916 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2057K,11%释放44988K/50119K,暂停11ms 1ms,总计43ms 10-12 06:52:33.916 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 21ms 10-12 06:52:33.988 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2044K,11%释放44991K/50119K,暂停11ms 1ms,总计41ms 10-12 06:52:33.988 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 21ms 10-12 06:52:34.056 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2037K,11%释放45002K/50119K,暂停11ms 1ms,总计41ms 10-12 06:52:34.060 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 8ms 10-12 06:52:34.132 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2050K,11%释放44995K/50119K,暂停11毫秒0毫秒,总计42毫秒10-12 06:52:34.132 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 8ms 10-12 06:52:34.216 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2017K,11%释放45026K/50119K,暂停11ms 11ms,总计53ms 10-12 06:52:34.216 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 2ms 10-12 06:52:34.284 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2067K,11%释放45004K/50119K,暂停11毫秒0毫秒,总计40毫秒10-12 06:52:34.288 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 23ms 10-12 06:52:34.372 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2028K,11%释放45000K/50119K,暂停11毫秒12毫秒,总计54毫秒10-12 06:52:34.452 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2036K,11%释放45012K/50119K,暂停12毫秒1毫秒,总计48毫秒10-12 06:52:34.452 23515-24293/com。机器人。visneta D/dalvikvm:等待并发GC阻塞4ms 10-12 06:52:34.524 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2056K,11%释放45003K/50119K,暂停12毫秒0毫秒,总计41ms 10-12 06:52:34.524 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 22ms 10-12 06:52:34.596 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2042K,11%释放45004K/50119K,暂停11ms 1ms,总计43ms 10-12 06:52:34.600 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 18ms 10-12 06:52:34.668 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2041K,11%释放45009K/50119K,暂停11ms 1ms,总计42ms 10-12 06:52:34.668 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 21ms 10-12 06:52:34.744 23515-23518/com。机器人。visneta D/dalvikvm:GC_并发释放2049K,11%释放45007K/50119K,暂停11ms 1ms,总计41ms 10-12 06:52:34.744 23515-24293/com。机器人。visneta D/dalvikvm:WAIT__FOR_CONCURRENT_GC blocked 19ms 10-12 06:52:34.776 23515-24293/com。机器人。visneta D/BatchOpenOrders:2000批开wos。10-12 06:52:34.776 23515-23515/com。机器人。visneta D/例行程序

10-12 06:52:44.368 23515-23856/com。机器人。visneta I/dalvikvm堆:对于3170458字节的分配,将堆(frag情况)增加到48.949MB

共有3个答案

丌官寒
2023-03-14

如果您可以控制服务器端IMO,那么响应数据压缩是解决此类问题的另一种工作方式。当然,在客户端,您必须首先解压缩网络响应,然后按照正常方式进行解析。

例如,如果您的服务器应用程序是ASP. NET Web API,您可以看看这个ASP. NET Web API压缩留档以供参考,我认为其他Web服务或某些Web服务器也支持压缩。

希望这有帮助!

邓宜年
2023-03-14

问题不在于Volley或Retrofit--它最有可能与大小或数据响应有关。如果你能控制网络服务,你应该考虑通过使用分页将信息分解成更小的块。

艾弘义
2023-03-14

响应非常大(超过5MB),而且弱小的设备没有足够的RAM进行响应是有道理的。这是一项艰巨的工作,但如果服务器端由您管理,则应该将此响应拆分为几个响应。分块发送是行不通的,因为在处理响应之前,您仍然需要将它们组合在一起,而且无论如何,我认为您不应该在一个请求中解析这么多数据。

我还建议您查看此答案,它将帮助您找到您检查的设备的限制:https://stackoverflow.com/a/9428660/5280641.

 类似资料:
  • 每次我尝试用截击的POST方法时,我都会犯严重的错误。我在getCause中得到null值,在getNetworkResponse中得到一些默认值。toString()。 如果我使用GET方法,这工作正常(我从我的网址得到响应)。 有人能帮忙吗?我能做什么? 错误日志: 错误:错误:com.android.volley.服务器错误 更新:networkResponse。statusCode是404

  • 我想在我的代码中使用Volley,我应该在下面的响应中使用哪种请求类型,我不明白。URL:::http://localhost/api/product/read.php

  • 我正在尝试使用Volley获取JSON对象以创建动态自动完成,但在使用Volley请求时,我在日志cat中看到: 截击:[486]基本网络。logSlowRequests:请求的HTTP响应= 这些答案并没有解决我的问题。 这里是初始化请求队列的Singleton类: 发出请求的方法: 下面是HTTP Connector类:

  • * *刚刚下载并安装了SDK Net 7.0.100,它破坏了现有的应用程序,它们不会在VS 2022或Rider中加载任何更多的应用程序。 复制了以下错误:** 错误:SDK解析程序失败。试图解析SDK“Microsoft . net . MSBuildSdkResolver”时失败。NET.Sdk”。例外:“微软。NET . SDK . workloadmanifestreader . wor

  • 问题内容: 我正在尝试摆脱配置中已弃用的Docker链接。当我重新创建容器时,剩下的就是摆脱那些nginx反向代理错误。 注意:我正在桥接模式下使用Docker网络。() 我在nginx中使用以下配置代码段: 我在Docker网络上以name 为主机名启动了一个容器。 然后,我在网络上启动了Nginx容器。 我可以从Nginx容器内ping 在nginx容器的文件中列出 Nginx日志说 我试过泊

  • 当我使用jsonObject请求进行网络调用时。我没有收到任何答复。我总是收到请求的HTTP响应= 当请求缓慢时,Android截击双发: 来源1,来源2,来源3