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); 方法,重复调用自己而出现死循环。


出现错误的代码部分:

    @Overridepublic void onSuccess(final int statusCode, final Header[] headers, final String responseBody) {if (statusCode != HttpStatus.SC_NO_CONTENT) {new Thread(new Runnable() {@Overridepublic void run() {try {final Object jsonResponse = parseResponse(responseBody);postRunnable(new Runnable() {@Overridepublic 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() {@Overridepublic 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 类自己简单实现下算了,等不了





转载于:https://www.cnblogs.com/zhouzme/p/5758444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python【进阶】4.文本和字节序列

文章目录1. 字符、码位和字节表述4.1字符问题2. bytes、bytearray 和 memoryview 等二进制序列的独特特性3. 全部 Unicode 和陈旧字符集的编解码器4.避免和处理编码错误5.处理文本文件的最佳实践6.默认编码的陷阱和标准 I/O 的问题7.规范化 Unicode 文本,进行安全的比较8.规范化…

C#序列化和反序列化

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。我想最主要的作用有: 1、在进程下次启动时读取上次保…

python【进阶】5.一等函数(注销)

在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程 序实体: 在运行时创建能赋值给变量或数据结构中的元素能作为参数传给函数能作为函数的返回结果 在 Python 中,所有函数都是一等对象。 5.1 把函数视作对象 >>> def d(n): ... …

进程状态转换(了解)

进程三个基本状态:就绪、阻塞、运行 这个比较简单,进程创建后进入就绪状态、然后若CPU空闲或能打断CPU正在执行的进程(优先级低的),那么就绪状态转换成运行态,运行时,进程需要用到其他资源&…

rebuild online意外终止导致ora-8104错误的实验

rebuild online意外终止导致ora-8104错误的实验 SQL> !oerr ora 810408104, 00000, "this index object %s is being online built or rebuilt"// *Cause: the index is being created or rebuild or waited for recovering // from the online (re)build // *Act…

关于range方法,如果你觉得python很简单就错了

前言:在系统学习迭代器之前,我一直以为 range() 方法也是用于生成迭代器的,现在却突然发现,它生成的只是可迭代对象,而并不是迭代器! 1、range() 是什么? 对于 range() 函数,有几个注…

centos下crontab的使用

1.作用使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。2.格式crontab [-u user] {-l | -r | -e}3.crontab命令选项: -u指定一个用户, -l列出某个用户的任务计划, -r删除某个用户的任务, -…

关于python3中的包operator(支持函数式编程的包)

文章目录1.functools2.operator.itemgetter3.operator.attrgetter虽然 Guido 明确表明,Python 的目标不是变成函数式编程语言,但是得益于 operator 和 functools 等包的支持,函数式编程风格也可以信手拈来。接下来的两节分别介绍这两 个包。 1.functools 示例1 使用 reduce 函…

collections 中的namedtuple

文章目录namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults参考:namedtuple 基本用法 Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。对于namedtuple,你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作区wa 中关键字的一条数据的 f1 f2字段会被wa中对应的字段值更新。 modify用于更新和新增数据,当表中没有数据时就新增,有就修改。 2、在使用binary search 时一定要先排序&am…

python[进阶] 6.使用一等函数实现设计模式

文章目录6.1.1 经典的“策略”模式6.1.2 使用函数实现“策略”模式6.1.3 选择最佳策略:简单的6.1.4 找出模块中的全部6.2 “命令”模式6.1.1 经典的“策略”模式 为抽象基类(Abstract Base Class,ABC),这么做是为了使…

2014阿里巴巴校园招聘笔试题 - 中南站

转载于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我们先暂且称呼为特殊方法。 单下划线开头(_foo)双下划线开头的(__foo)双下划线开头和结尾的( __foo__)代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx im…

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…

python爬虫面试遇到的问题

文章目录1python基础1.1 列表生成式和生成器的区别 ?1.2 如何不用任何循环快速筛掉列表中的奇数元素 ?1.3 map和reduce的用法1.4 装饰器的作用1.5 Python中__new__与__init方法的区别1.6 python中的设计模式1.7 lambda函数,以及它…

ubuntu18 常用命令

文章目录卸载和安装卸载和安装 1.打开一个终端,输入dpkg --list ,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。 2.安装 dpkg –i name.deb 安装一个 deb 包;在终端上输入命令sudo apt-get --purge remove 包…

以嵌入式系统设计师考试成绩,开始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 转载于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载: l jdk; 从Oracle官方网站:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下载jdk,win7是默认安装在C:\Program Files (x86)\Java\jdk1.6.0_25路径下…

cookie,session的区别和联系(补充token)

文章目录1 http为什么是无状态的2 cookie 和session 的区别详解3 token参考:备注: 博客文章仅限于学习,禁止商用1 http为什么是无状态的 2 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解。先简单介绍一下。 二者的定…

库函数和系统调用的区别

前言 这是一对非常容易混淆的概念。对于用户( 应用程序开发者 )来说,并不一定要严格区分其意义。因为在用户看来,它们都是以C函数的形式出现的。但了解二者的区别对我们掌握整个计算机系统有很大帮助。 区别 1. 一部分库函数实现需要使用系统调用( 如 pr…