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