网络接口json数据量超大时, 超时及OOM问题求解

zhujunhua2012 2015-07-23 05:53:06
服务器接口返回的数据量很大(json格式), HttpResponse解析的时候, 耗时不一定, 有时5秒左右,有时10秒,有时20秒,甚至30秒,偶尔100+.
数据量很大的时候, 解析时间较长, 并且偶尔会报OOM.
====>
1. 解析耗时问题;
2. 大数据量,字符串OOM问题.
请各位大神指点一二.

PS:
由于业务方面的原因, 较大的数据量不方便分页处理.

以下两个方法,都会出现上面的问题.

系统API:

String data = EntityUtils.toString(response.getEntity(), "UTF-8" );


自己实现的数据读取:

HttpEntity httpEntity = response.getEntity();
InputStream inputStream = null;
try {
inputStream = httpEntity.getContent();
} catch (IllegalStateException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
if (null == inputStream) {
return null;
}

String data = "";
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
if (null == br) {
return null;
}

StringBuffer buffer = new StringBuffer();
String line = null;
try {
while ((line = br.readLine()) != null) {
buffer.append(line).append("\n");
}
data = buffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
...全文
5312 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujunhua2012 2018-02-26
  • 打赏
  • 举报
回复
最后使用 fastjson的 JSONReader 使用流进行处理,暂时没有再oom了。
tcmakebest 2016-03-09
  • 打赏
  • 举报
回复
为什么流行分页? 就是为了用户体验,楼主要考虑一下设计问题.
c2466081069 2016-03-09
  • 打赏
  • 举报
回复
求助我的数据有3M......
weixin_30007461 2015-08-04
  • 打赏
  • 举报
回复
能默默默默关注我
zhujunhua2012 2015-07-31
  • 打赏
  • 举报
回复
引用 10 楼 myearth2010 的回复:
android has a heap size limit.avoid loading the whole content in memory if it can be avoided. and I got this: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonStreamParser.html the whole idea:不要把大量数据放入内存,取你感兴趣的部分。
用的 com.amazonaws.util.json.JSONObject, 直接接收response的结果的inputStream, 构造json. 但是数据量较大的时候, 解析还是较慢, 能达到七八秒, 不是很稳定. 没用string之后, OOM的问题是没再出现了.
情殇ming 2015-07-31
  • 打赏
  • 举报
回复
额 你用xUtil 框架 里面不就自动处理OOm了 还要考虑这些。。。
「已注销」 2015-07-28
  • 打赏
  • 举报
回复
读取数据的时候进行判断,若超出一个指定临界值就先缓存到磁盘。
github_neolau 2015-07-26
  • 打赏
  • 举报
回复
android has a heap size limit.avoid loading the whole content in memory if it can be avoided. and I got this: https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonStreamParser.html the whole idea:不要把大量数据放入内存,取你感兴趣的部分。
zhujunhua2012 2015-07-25
  • 打赏
  • 举报
回复
引用 7 楼 pro_programmer的回复:
largeheap="true" 算自己解决了 配置文件application加上这个就可以了 参考链接 http://blog.csdn.net/pierce0young/article/details/8494493
这个只是申请了更大内存,并没有从根本解决问题,后期数据量更大时,还是会出问题的。。。
zhujunhua2012 2015-07-25
  • 打赏
  • 举报
回复
引用 6 楼 github_neolau的回复:
数据最大有多少k?
大概五六十k,但后面也可能更大。。。
pro_programmer 2015-07-25
  • 打赏
  • 举报
回复
largeheap="true" 算自己解决了 配置文件application加上这个就可以了 参考链接 http://blog.csdn.net/pierce0young/article/details/8494493
zhujunhua2012 2015-07-24
  • 打赏
  • 举报
回复
解析慢...
引用 2 楼 wmg494005678 的回复:
是下载慢还是解析慢啊。。
zhujunhua2012 2015-07-24
  • 打赏
  • 举报
回复
这个网络请求本来就是在子线程做的啊...
引用 1 楼 haijianmingCSDN 的回复:
你单独开个线程按照1024k边读边存不就ok了,并且你在这儿不能用string应该用stringbuffer
网络咖啡 2015-07-24
  • 打赏
  • 举报
回复
可以考虑重新设计接口,分解成多个接口
github_neolau 2015-07-24
  • 打赏
  • 举报
回复
数据最大有多少k?
wmg494005678 2015-07-23
  • 打赏
  • 举报
回复
是下载慢还是解析慢啊。。
haijianmingCSDN 2015-07-23
  • 打赏
  • 举报
回复
你单独开个线程按照1024k边读边存不就ok了,并且你在这儿不能用string应该用stringbuffer

80,330

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧