我現在用的是 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 類自己簡單實現下算了,等不了