【发布时间】:2016-01-05 05:12:02
【问题描述】:
我正在使用 Volley 来管理我的应用。有时当响应很大时,我会在没有太多 RAM 的设备上得到 OOM。我不确定如何解决这个问题。我了解 Volley 将其响应存储在内存中,但我的应用程序围绕 Volley 进行了如此多的操作,以至于切换起来会很痛苦。我在使用 Retrofit 时也遇到了问题。我尝试过使用 JsonReader,但它似乎仍然会发生。我有一个与 Volley 一起使用的自定义请求。它返回一个 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 的示例响应。
GsonRequestResponse: {"user_company_info":[{"id":"1","company_id":"5","circle_id":"34","status":"A","cat_id":"1 ","company_map":"0","timestamp":"2015-07-09 15:28:40","add_by":"1","add_date":"0000-00-00","name" :"FSM"," added_datetime":"2014-02-12 16:16:51","clause":"fsm_company","company_name":"Assero Services LLC - FSM","circles":[{"id ":"1","company_id":"5","circle_id":"34","status":"A","cat_id":"1","company_map":"0","timestamp": "2015-07-09 15:28:40","add_by":"1","add_date":"0000-00-00","circle_name":"Cityside - HUD 合同区 - 5D","create_by" :"2536","create_date":"0000-00-00","circle_owner":"0","circle_owner_company":"26792","circle_company_identifier":"0","level":"OUTER"," assign_fsm":"26792","assign_client":"25491","assign_am":"0","routine_1":"10065","routine_2":"10209","routine_3":"10062","routine_4" :"0","image_duplicate_api":"Y","routine_1_type":null,"routine_1_method":null,"routine_1_cancel_buffer":null,"routine_2_type":null,"routine_2_method":null,"routine_2_cancel_buffe r":null,"routine_3_type":null,"routine_3_method":null,"routine_3_cancel_buffer":null,"routine_4_type":null,"routine_4_method":null,"routine_4_cancel_buffer":null,"name":"FSM"," added_datetime":"2014-02-12 16:16:51","clause":"fsm_company","can_issue":"1"},{"id":"1","company_id":"5", "circle_id":"33","status":"A","cat_id":"1","company_map":"0","timestamp":"2015-07-09 15:28:40"," added_by":"1","add_date":"0000-00-00","circle_name":"Cityside - HUD 合同区 - 4D","create_by":"2536","create_date":"0000-00- 00","circle_owner":"0","circle_owner_company":"26792","circle_company_identifier":"0","level":"OUTER","assign_fsm":"26792","assign_client":"25491" ,"assign_am":"0","routine_1":"10065","routine_2":"10209","routine_3":"10062","routine_4":"0","image_duplicate_api":"Y"," routine_1_type":null,"routine_1_method":null,"routine_1_cancel_buffer":null,"routine_2_type":null,"routine_2_method":null,"routine_2_cancel_buffer":null,"routine_3_type":null,"routine_3_method":null,"routine_3_cancel_buffer" :nu ll,"routine_4_type":null,"routine_4_method":null,"routine_4_cancel_buffer":null,"name":"FSM"," added_datetime":"2014-02-12 16:16:51","clause":" fsm_company","can_issue":"2"},{"id":"1","company_id":"5","circle_id":"32","status":"A","cat_id":" 1","company_map":"0","timestamp":"2015-07-09 15:28:40","add_by":"1","add_date":"0000-00-00","circle_name ":"Cityside - HUD 合同区域 - 2D","create_by":"2536","create_date":"0000-00-00","circle_owner":"0","circle_owner_company":"26792","circle_company_identifier ":"0","level":"OUTER","assign_fsm":"26792","assign_client":"25491","assign_am":"0","routine_1":"10065","routine_2": "10209","routine_3":"0","routine_4":"0","image_duplicate_api":"Y","routine_1_type":null,"routine_1_method":null,"routine_1_cancel_buffer":null,"routine_2_type": null,"routine_2_method":null,"routine_2_cancel_buffer":null,"routine_3_type":null,"routine_3_method":null,"routine_3_cancel_buffer":null,"routine_4_type":null,"routine_4_method":null,"routine_4_cancel_buffer":null, “姓名” :"FSM"," added_datetime":"2014-02-12 16:16:51","clause":"fsm_company","can_issue":"1"}
编辑:
大家好,所以我尝试拆分我的回复。它似乎有所帮助,但在 3-4 个请求之后,它仍然给了我一个 OOM。我相信这与Volley有关。这是我对每个响应的 GC,它每次都会增长。请注意,堆每次都会增长。我在它们之间放置了一些间距,以便您可以看到堆日志。
10-12 06:52:21.236 23515-23515/com.droid.visneta D/RequestQueue: batch_open_orders_request 开始... 10-12 06:52:21.236 23515-23855/com.droid.visneta D/GsonCustomHeaders: {UserSession=source=Android-ffffffff-83d1-3e36-ffff-ffff99d603a9,id=6,token=9eb7c26405defb48fe884cfef8000696} 10-12 06:52:21.236 23515-23855/com.droid.visneta I/qtaguid: 失败 write_ctrl(t -1 4883184842671390720 -1) res=-1 errno=9 10-12 06:52:21.236 23515-23855/com.droid.visneta I/qtaguid:使用标签 43c48ebe00000000(1136955070) 为 uid -1 标记套接字 -1 失败 errno=-9 10-12 06:52:21.236 23515-23855/com.droid.visneta I/NetworkManagementSocketTagger: tagSocketFd(-1, 1136955070, -1) 因 errno-9 而失败 10-12 06:52:21.936 23515-23855/com.droid.visneta I/System.out:从启用的协议中删除 SSLv3 10-12 06:52:21.976 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 1990K, 15% free 33771K/39495K, paused 11ms+1ms,总共38ms 10-12 06:52:29.940 23515-23855/com.droid.visneta I/qtaguid: 失败 write_ctrl(u -1) res=-1 errno=9 10-12 06:52:29.940 23515-23855/com.droid.visneta I/qtaguid:取消标记套接字 -1 失败 errno=-9 10-12 06:52:29.940 23515-23855/com.droid.visneta W/NetworkManagementSocketTagger: untagSocket(-1) 失败,错误码 -9 10-12 06:52:31.808 23515-23855/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 747K,14% 释放 34267K/39495K,暂停 18ms,共 18ms 10-12 06:52:32.616 23515-23855/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 596K,12% 释放 34778K/39495K,暂停 21ms,共 21ms 10-12 06:52:32.616 23515-23855/com.droid.visneta I/dalvikvm-heap:将堆(碎片情况)增加到 36.423MB,分配 2093068 字节 10-12 06:52:32.648 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 10K,12% 释放 36811K/41543K,暂停 10ms+1ms,共 29ms 10-12 06:52:32.648 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 9ms 10-12 06:52:33.272 23515-23855/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 1122K,14% 释放 35790K/41543K,暂停 20ms,共 20ms 10-12 06:52:33.272 23515-23855/com.droid.visneta D/Volley: [212] BasicNetwork.logSlowRequests: HTTP 响应请求=https://dev.visneta.com/amf/gateway?contentType=application/json0x43c48ebe NORMAL 2> [lifetime=12039], [大小=1652746],[rc=200],[retryCount=0] 10-12 06:52:33.296 23515-23855/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 2048K,15% 释放 35360K/41543K,暂停 22ms,共 22ms
10-12 06:52:33.296 23515-23855/com.droid.visneta I/dalvikvm-heap:将堆(碎片情况)增加到 38.149MB,分配 3305504 字节
10-12 06:52:33.340 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 1K,14% 释放 38586K/44807K,暂停 11ms+11ms,总共 43ms 10-12 06:52:33.392 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 555K,11% 释放 40078K/44807K,暂停 11ms+0ms,共 33ms 10-12 06:52:33.392 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 9ms 10-12 06:52:33.448 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 558K,8% 释放 41568K/44807K,暂停 11ms+1ms,共 36ms 10-12 06:52:33.448 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 15ms 10-12 06:52:33.504 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 564K,4% 释放 43050K/44807K,暂停 12ms+1ms,共 38ms 10-12 06:52:33.504 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 15ms 10-12 06:52:33.560 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 561K,3% 释放 44537K/45575K,暂停 10ms+1ms,共 38ms 10-12 06:52:33.560 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 8ms 10-12 06:52:33.616 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 577K,3% 释放 46056K/47111K,暂停 11ms+0ms,共 38ms 10-12 06:52:33.624 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 9ms 10-12 06:52:33.676 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 550K,3% 释放 47555K/48583K,暂停 11ms+1ms,共 38ms 10-12 06:52:33.676 23515-23855/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 16ms 10-12 06:52:33.764 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 4602K, 11% free 45006K/50119K, paused 11ms+12ms,总共58ms 10-12 06:52:33.840 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2055K, 11% free 44998K/50119K, paused 10ms+0ms,总共45ms 10-12 06:52:33.840 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 26ms 10-12 06:52:33.916 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2057K, 11% free 44988K/50119K, paused 11ms+1ms,总共43ms 10-12 06:52:33.916 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 21ms 10-12 06:52:33.988 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2044K, 11% free 44991K/50119K, paused 11ms+1ms,总共41ms 10-12 06:52:33.988 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 21ms 10-12 06:52:34.056 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2037K, 11% free 45002K/50119K, paused 11ms+1ms,总共41ms 10-12 06:52:34.060 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 8ms 10-12 06:52:34.132 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2050K, 11% free 44995K/50119K, paused 11ms+0ms,总共42ms 10-12 06:52:34.132 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 8ms 10-12 06:52:34.216 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2017K, 11% free 45026K/50119K, paused 11ms+11ms,总共53ms 10-12 06:52:34.216 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 2ms 10-12 06:52:34.284 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2067K, 11% free 45004K/50119K, paused 11ms+0ms,总共40ms 10-12 06:52:34.288 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 23ms 10-12 06:52:34.372 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2028K, 11% free 45000K/50119K, paused 11ms+12ms,总共54ms 10-12 06:52:34.452 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2036K, 11% free 45012K/50119K, paused 12ms+1ms,总共48ms 10-12 06:52:34.452 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 4ms 10-12 06:52:34.524 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2056K, 11% free 45003K/50119K, paused 12ms+0ms,总共41ms 10-12 06:52:34.524 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 22ms 10-12 06:52:34.596 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2042K, 11% free 45004K/50119K, paused 11ms+1ms,总共43ms 10-12 06:52:34.600 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 18ms 10-12 06:52:34.668 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2041K, 11% free 45009K/50119K, paused 11ms+1ms,总共42ms 10-12 06:52:34.668 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 21ms 10-12 06:52:34.744 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 2049K, 11% free 45007K/50119K, paused 11ms+1ms,总共41ms 10-12 06:52:34.744 23515-24293/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 19ms 10-12 06:52:34.776 23515-24293/com.droid.visneta D/BatchOpenOrders: 2000 打开 wos 批处理。 10-12 06:52:34.776 23515-23515/com.droid.visneta D/常规服务数量:1411 10-12 06:52:34.776 23515-23515/com.droid.visneta D/Open 订单数:2000 10-12 06:52:37.288 23515-23515/com.droid.visneta D/RequestQueue: batch_open_orders_request 开始... 10-12 06:52:37.288 23515-23856/com.droid.visneta D/GsonCustomHeaders: {UserSession=source=Android-ffffffff-83d1-3e36-ffff-ffff99d603a9,id=6,token=9eb7c26405defb48fe884cfef8000696} 10-12 06:52:37.288 23515-23856/com.droid.visneta I/qtaguid: 失败 write_ctrl(t -1 4883184842671390720 -1) res=-1 errno=9 10-12 06:52:37.288 23515-23856/com.droid.visneta I/qtaguid:使用标签 43c48ebe00000000(1136955070) 为 uid -1 标记套接字 -1 失败 errno=-9 10-12 06:52:37.288 23515-23856/com.droid.visneta I/NetworkManagementSocketTagger: tagSocketFd(-1, 1136955070, -1) 因 errno-9 而失败 10-12 06:52:37.592 23515-23856/com.droid.visneta I/System.out:从启用的协议中删除 SSLv3 10-12 06:52:42.612 23515-23856/com.droid.visneta I/qtaguid: 失败的 write_ctrl(u -1) res=-1 errno=9 10-12 06:52:42.616 23515-23856/com.droid.visneta I/qtaguid:取消标记套接字 -1 失败 errno=-9 10-12 06:52:42.616 23515-23856/com.droid.visneta W/NetworkManagementSocketTagger: untagSocket(-1) 失败,错误码 -9 10-12 06:52:42.924 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 1779K, 10% free 45206K/50119K, paused 11ms+1ms,总共42ms 10-12 06:52:43.724 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT freed 1104K, 9% free 46034K/50119K, paused 10ms+0ms,总共39ms 10-12 06:52:43.816 23515-23856/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 15K,9% 释放 46033K/50119K,暂停 28ms,共 28ms 10-12 06:52:43.816 23515-23856/com.droid.visneta I/dalvikvm-heap:将堆(碎片情况)增加到 47.417MB,分配 2095116 字节 10-12 06:52:43.852 23515-23518/com.droid.visneta D/dalvikvm: GC_CONCURRENT 释放 8K,8% 释放 48071K/52167K,暂停 12ms+1ms,共 38ms 10-12 06:52:43.852 23515-23856/com.droid.visneta D/dalvikvm: WAIT_FOR_CONCURRENT_GC 阻塞 16ms 10-12 06:52:44.312 23515-23856/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 1108K,10% 释放 47049K/52167K,暂停 26ms,共 26ms 10-12 06:52:44.312 23515-23856/com.droid.visneta I/dalvikvm-heap:将堆(碎片情况)增加到 47.922MB,分配 1585235 字节 10-12 06:52:44.340 23515-23856/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 0K,10% 释放 48597K/53767K,暂停 25ms,共 25ms 10-12 06:52:44.340 23515-23856/com.droid.visneta D/Volley:[213] BasicNetwork.logSlowRequests:请求的 HTTP 响应=https://dev.visneta.com/amf/gateway?contentType=application/json0x43c48ebe NORMAL 3> [lifetime=7052],[大小=1585223],[rc=200],[retryCount=0] 10-12 06:52:44.364 23515-23856/com.droid.visneta D/dalvikvm: GC_FOR_ALLOC 释放 2050K,14% 释放 46551K/53767K,暂停 26ms,共 26ms
10-12 06:52:44.368 23515-23856/com.droid.visneta I/dalvikvm-heap:将堆(碎片情况)增加到 48.949MB,分配 3170458 字节
【问题讨论】:
-
...when the response data length is returning 5511532...什么?位?字节?千字节?兆字节?写出测量单位。我建议您使用每个文件最多 250 KB,因为无线网络往往会失去连接,并且传输比电缆更差……最后,所有这些信息在所有请求中都同时需要吗?如果您参与信息并通过“含义”进行隔离,则用户可以看到信息,而不会下载无关信息。 -
字节...是的,他们需要所有信息。