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 类自己简单实现下算了,等不了





  • 相关阅读:
    Bootstrap 实战之响应式个人博客 (一)
    观察者(发布——订阅)模式
    迭代器模式
    代理模式
    策略模式
    单例模式
    CSS3 媒体记
    CSS3 动画记
    css3 过渡记
    CSS3 变形记
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758444.html
Copyright © 2011-2022 走看看