Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT
我现在用的是 AndroidAsyncHttp 1.4.4 版本,之前遇到一个很奇怪的问题,
当使用 JsonHttpResponseHandler 解析请求的页面出现服务器错误或其他情况返回的内容不是 JSON 字符串时不会调用自己复写实现的 onSuccess 或者 onFailure 方法,将会出现不停打印 GC_CONCURRENT 出现死循环,自己完全没法调试的问题。
后来在 论坛上发了一篇帖子但好多天都没人回复 http://bbs.csdn.net/topics/390734079
经过多次检查,排除了自己 JAVA 代码出错的可能,确定应该是这个库内部代码出现故障,不过遇到这种情况比较少,之前比较忙也懒得去计较了,但一直都放不下,今天POST数据时又遇到这个问题,真要崩溃了,连服务器返回的内容错误提示都看不到,完全没法调试了,必须要仔细分析研究下了。
查看源码,先查看在转换 JSON 之前是否有执行过 onSuccess 或 onFailure , 打印 Log 日志后发现当服务器出现 notice 或者 error 等错误时,会重复调用重复调用 onSuccess(statusCode, headers, (String) jsonResponse); 方法,重复调用自己而出现死循环。
出现错误的代码部分:
@Override
public void onSuccess(final int statusCode, final Header[] headers, final String responseBody) {
if (statusCode != HttpStatus.SC_NO_CONTENT) {
new Thread(new Runnable() {
@Override
public void run() {
try {
final Object jsonResponse = parseResponse(responseBody);
postRunnable(new Runnable() {
@Override
public void run() {
if (jsonResponse instanceof JSONObject) {
onSuccess(statusCode, headers, (JSONObject) jsonResponse);
} else if (jsonResponse instanceof JSONArray) {
onSuccess(statusCode, headers, (JSONArray) jsonResponse);
} else if (jsonResponse instanceof String) {
onSuccess(statusCode, headers, (String) jsonResponse);
} else {
onFailure(new JSONException("Unexpected type " + jsonResponse.getClass().getName()), (JSONObject) null);
} }
});
} catch (final JSONException ex) {
postRunnable(new Runnable() {
@Override
public void run() {
onFailure(ex, (JSONObject) null);
}
});
}
}
}).start();
} else {
onSuccess(statusCode, headers, new JSONObject());
}
}
JsonHttpResponseHandler 类中的
public void onSuccess(final int statusCode, final Header[] headers, final String responseBody)
当出现 HTTP 500 错误时会重复执行
else if (jsonResponse instanceof String) {
onSuccess(statusCode, headers, (String) jsonResponse);
}
导致出现死循环,此处应该改成类似下面这样处理
else if (jsonResponse instanceof String) {
onFailure(statusCode, ...);
}
因此这个 JsonHttpResponseHandler 不能使用了,只能自己重新实现,o(︶︿︶)o 唉。。崩溃
后来想想先去 github 上反馈下,顺便看看现在的源码是否也是这样的,结果发现官方居然刚刚更新了该部分代码,修复了该问题,我只能说真是TMD太巧了吧,为什么不早点儿修复啊,浪费了我这么多生命值,这个库应该是用的人比较多的了,比那个 okHttp 还要热门的吧!
卧槽, 20小时前刚刚更新修复了该错误
既然如此 不多说了,先去看看有没有最新的 jar 下载个再试试了,这个该死的问题终于要被解决了~~
2014/03/22 00:31 补充下:
官方现在还没有释出新版本,1.4.5 还没正式发布,不过官方介绍已经加上了 maven 的使用方法,这样可以一直保持最新版不用手动去检查了
compile 'com.loopj.android:android-async-http:1.4.+'
试了半天不知道如何使用他的 1.4.5-SNAPSHOT 开发版本
但看到 1.4.4 已经是差不多半年前发布的了,1.4.5 不知何时才能正式发布,只有自己继承下 JsonHttpResponseHandler 类自己简单实现下算了,等不了
Android开源库loopj的android-async-http的 JsonHttpResponseHandler 存在死循环GC_CONCURRENT的更多相关文章
- <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介
转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...
- Android 开源库和项目 3
Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...
- GitHub上排名前100的Android开源库介绍(来自github)
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...
- GitHub Top 100的Android开源库
摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...
- Android 开源库获取途径整理
介绍眼下收藏 Android 开源库比較多的 GitHub 项目.站点.Twitter.App 及怎样获取最新的 Android 开源库. 微信号: 1. GitHub Android 开源项目汇总 ...
- 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍
GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...
- GitHub上排名前100的Android开源库介绍
GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...
- 【Java&Android开源库代码剖析】のandroid-smart-image-view
Android应用开发已经进入到相对成熟的阶段,特别在国外,涌现出了各式各样的成熟稳定的开源库,供普通开发者使用.这种情况虽然极大加速了app开发的进程,但同时带来的问题是大多数普通开发者在使用这些开 ...
随机推荐
- 自然语言处理(NLP)常用开源工具总结(转)
..................................内容纯转发+收藏................................... 学习自然语言这一段时间以来接触和听说了好多开 ...
- gcc编译器优化给我们带来的麻烦???
gcc编译器优化给我们带来的麻烦??? 今天看到一个很有趣的程序,如下: ? 1 2 3 4 5 6 7 8 9 int main() { const int a = 1; int * ...
- 我的Emacs折腾经验谈(三) speedbar , tabbar 还有linum-mode
离上一篇博客已经很遥远了,最近总是各种逛,但没有心思静下来写点东西,这回写一下我之前用的一些东西. Speedbar 首先是speedbar,这个东西是emacs自带的,效果立竿见影,请输入M-x s ...
- 一步一步深入spring(2)-三种方式来实例化bean
在一步一步深入spring(1)--搭建和测试spring的开发环境中提到了一种实例化bean的方式,也是最基本的使用构造器实例化bean 1.使用构造器实例化bean:这是最简单的方式,Spring ...
- a5站长论坛和s8站长论坛-网上兼职做任务赚钱的两大网站
1.什么是做任务赚钱? 简而言之,就是你做别人不在行而你在行的技术 ,如 图片美化 网站建设 网站修改 网站推广等网络业务. 2.任务赚钱有什么特点? 完全免费,你付出的是技术和时间,完全免费,不过 ...
- ios-制作静态.a文件
一.制作静态库文件 /*静态库制作*/ // MakeA.h -(NSString*)testA; // MakeA.m -(NSString*)testA{ return @"静态库测试成 ...
- SQlServer---时间的操作
select Day(getdate())--当前日是这个月的第几天 -Day(getdate()))))--当前月有多少天 -Day(getdate()))))-Day(getdate())--当前 ...
- 结构-行为-样式-Angularjs-ngSanitize
简单点,上代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- C语言之总结1
1). 终端常用的命令: pwd 显示终端的工作路径. ls list 清单 显示当前工作路径下的所有的文件以及文件夹. ls -l 以详细信息显示当前工作路径下的所有的文件以及文件夹. cd 要切 ...
- error C2448 函数样式初始值设定项类似函数定义
类似这种的 int grow_expansion(elen, e, b, h) int elen; REAL *e; REAL b; REAL *h; { // function definition ...