閱讀524 返回首頁    go iPhone_iPad_Mac_apple


Android開源庫loopj的android-async-http的 JsonHttpResponseHandler 存在死循環GC_CONCURRENT

我現在用的是 AndroidAsyncHttp 1.4.4 版本,之前遇到一個很奇怪的問題,

當使用 JsonHttpResponseHandler 解析請求的頁麵出現服務器錯誤或其他情況返回的內容不是 JSON 字符串時不會調用自己複寫實現的 onSuccess 或者 onFailure 方法,將會出現不停打印 GC_CONCURRENT 出現死循環,自己完全沒法調試的問題。


後來在 論壇上發了一篇帖子但好多天都沒人回複 https://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 類自己簡單實現下算了,等不了





最後更新:2017-04-03 12:55:46

  上一篇:go ???????????????????????? FindBugs-??????-????????????-?????????
  下一篇:go linux下ntp時間服務器配置及客戶端注意事項