zoukankan      html  css  js  c++  java
  • 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 类自己简单实现下算了,等不了





  • 相关阅读:
    HDU 5528 Count a * b 欧拉函数
    HDU 5534 Partial Tree 完全背包
    HDU 5536 Chip Factory Trie
    HDU 5510 Bazinga KMP
    HDU 4821 String 字符串哈希
    HDU 4814 Golden Radio Base 模拟
    LA 6538 Dinner Coming Soon DP
    HDU 4781 Assignment For Princess 构造
    LA 7056 Colorful Toy Polya定理
    LA 6540 Fibonacci Tree
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758444.html
Copyright © 2011-2022 走看看