我现在用的是 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的更多相关文章

  1. <Android开源库 ~ 1> GitHub Android Libraries Top 100 简介

    转载自GitHub Android Libraries Top 100 简介 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitH ...

  2. Android 开源库和项目 3

    Android 开源库和项目 Android 开源库和项目 2 1.Matisse Android 图片选择器 -- 知乎开源 github 地址:https://github.com/zhihu/M ...

  3. GitHub上排名前100的Android开源库介绍(来自github)

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...

  4. GitHub Top 100的Android开源库

    摘要: 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择「Best M... 本项目主要对目前 GitH ...

  5. 【Java&amp;Android开源库代码分析】のandroid-async-http の开盘

          在<[Java&Android开源库代码剖析]のandroid-smart-image-view>一文中我们提到了android-async-http这个开源库,本文正 ...

  6. Android 开源库获取途径整理

    介绍眼下收藏 Android 开源库比較多的 GitHub 项目.站点.Twitter.App 及怎样获取最新的 Android 开源库. 微信号: 1. GitHub Android 开源项目汇总 ...

  7. 我的Android进阶之旅】GitHub 上排名前 100 的 Android 开源库进行简单的介绍

    GitHub Android Libraries Top 100 简介 本文转载于:https://github.com/Freelander/Android_Data/blob/master/And ...

  8. GitHub上排名前100的Android开源库介绍

    GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...

  9. 【Java&Android开源库代码剖析】のandroid-smart-image-view

    Android应用开发已经进入到相对成熟的阶段,特别在国外,涌现出了各式各样的成熟稳定的开源库,供普通开发者使用.这种情况虽然极大加速了app开发的进程,但同时带来的问题是大多数普通开发者在使用这些开 ...

随机推荐

  1. 自承载Web API

    自承载Web API 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html As ...

  2. [转]Libev教程

    libev Table of Contents 1 libev 1.1 About The Code 1.2 EventLoop 1.3 Watcher 1.4 How it works 1.4.1 ...

  3. last error : SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate veri

    今天在用搜狐提供的邮件群发系统的sdk,做发送邮件的测试时,提示: last error : SSL certificate problem, verify that the CA cert is O ...

  4. 关于 HttpModule配置问题

    在经典模式下,配置到System.web节点 在IIS7以上的集成模式下,要配置到<system.webServer>节点 否则会出现类似一下的错误: 具体配置如下: <config ...

  5. API HOOK库

    API HOOK库 API HOOK有两种做法,一种是SetWindowHookEx,简单易用,但如果做其它的HOOK,如HOOK OpenProcess,就需要修改内存地址了,内存地址可以通过Wri ...

  6. 基本Guava工具

      使用Joiner类 将任意字符串通过分隔符进行连接到一起是大多程序员经常做的事情.他们经常使用array,list,iterable并且循环变量将每一个临时变量添加到StringBuilder当中 ...

  7. (Java 多线程系列)java volatile详解

    在前面的文章里面介绍了synchronized关键字的用法,这篇主要介绍volatile关键字的用法. Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其它 ...

  8. gcc编译器优化给我们带来的麻烦???

    gcc编译器优化给我们带来的麻烦??? 今天看到一个很有趣的程序,如下: ? 1 2 3 4 5 6 7 8 9 int main() {     const int a = 1;     int * ...

  9. CSS 实现的各种球体效果

    CSS 实现的各种球体效果[附在线演示] CSS 可以实现很多你想不到的效果,今天我们来尝试使用 CSS 实现各种球体效果.有两种方法可以实现,第一种是使用大量的元素创建实际的 3D 球体,这种方法有 ...

  10. Linux epoll总结

    Linux epoll总结 Linux  epoll epoll是Kernel 2.6后新加入的事件机制,在高并发条件下,远优于select.epoll最大的好处在于它不会随着监听fd数目的增长而降低 ...