我现在用的是 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. HttpClient 检索与获取过程数据

    使用 HttpClient 检索与获取过程数据   对于System.Net.Http的学习(一)——System.Net.Http 简介 对于System.Net.Http的学习(二)——使用 Ht ...

  2. [Usaco2007 Dec]宝石手镯[01背包][水]

    Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯.很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上.对于第i块宝石,它的重量为 ...

  3. Hive查询结果批量插入分区

    在hive的数据建表时,为了查询的高效性,我们经常会对表建立分区,例如下面的表 create external table dm_fan_photo_icf_basic(user string, it ...

  4. [转]iOS Assembly Tutorial: Understanding ARM

    iOS Assembly Tutorial: Understanding ARM Do you speak assembly? When you write Objective-C code, it ...

  5. mac在线恢复教程

    上个周,我本来想升级一下Xcode,可是我的系统是10.8de,xcode5.0.1 最低支持10.8.4 所以就想升级一下我的mac的系统,可是因为我的appstore 是从别人的电脑上考过来的,要 ...

  6. Java笔记:内部类

    1.把一个类放在另一类内部定义,这个定义在其他类里面的类就叫做内部类,包含内部类的类叫做外部类.内部类成员可以直接访问外部类的私有数据,但是外部类不能访问内部类的实现细节. 2.非静态内部类(没有st ...

  7. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  8. C#编写Windows 服务

    C#编写Windows 服务 Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时 ...

  9. Struts入门(二) 配置文件的讲解

    上一章我们演示了Struts项目的搭建  可以看到里面有几个重要的配置文件  下面我们来说明一下这3个配置文件 1.web.xml 2.strtus.xml 3.struts.properties 1 ...

  10. java 线程池简介

    线程池简介 通过前面的章节我们了解到如何去创建线程,但是如果我们每一次多去创建线程.我们是否回去想,既然是创建线程我们为什么不能像连接池一样呢.做到线程之间的复用呢,减少资源之间的让费呢? jdk为我 ...