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); 方法,重復調用自己而出現死循環。


出現錯誤的代碼部分:

    @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 類自己簡單實現下算了,等不了





轉載于:https://www.cnblogs.com/zhouzme/p/5758444.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273820.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273820.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273820.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python【進階】4.文本和字節序列

文章目錄1. 字符、碼位和字節表述4.1字符問題2. bytes、bytearray 和 memoryview 等二進制序列的獨特特性3. 全部 Unicode 和陳舊字符集的編解碼器4.避免和處理編碼錯誤5.處理文本文件的最佳實踐6.默認編碼的陷阱和標準 I/O 的問題7.規范化 Unicode 文本,進行安全的比較8.規范化…

C#序列化和反序列化

序列化和反序列化我們可能經常會聽到,其實通俗一點的解釋,序列化就是把一個對象保存到一個文件或數據庫字段中去,反序列化就是在適當的時候把這個文件再轉化成原來的對象使用。我想最主要的作用有: 1、在進程下次啟動時讀取上次保…

python【進階】5.一等函數(注銷)

在 Python 中,函數是一等對象。編程語言理論家把“一等對象”定義為滿足下述條件的程 序實體: 在運行時創建能賦值給變量或數據結構中的元素能作為參數傳給函數能作為函數的返回結果 在 Python 中,所有函數都是一等對象。 5.1 把函數視作對象 >>> def d(n): ... …

進程狀態轉換(了解)

進程三個基本狀態:就緒、阻塞、運行 這個比較簡單,進程創建后進入就緒狀態、然后若CPU空閑或能打斷CPU正在執行的進程(優先級低的),那么就緒狀態轉換成運行態,運行時,進程需要用到其他資源&…

rebuild online意外終止導致ora-8104錯誤的實驗

rebuild online意外終止導致ora-8104錯誤的實驗 SQL> !oerr ora 810408104, 00000, "this index object %s is being online built or rebuilt"// *Cause: the index is being created or rebuild or waited for recovering // from the online (re)build // *Act…

關于range方法,如果你覺得python很簡單就錯了

前言:在系統學習迭代器之前,我一直以為 range() 方法也是用于生成迭代器的,現在卻突然發現,它生成的只是可迭代對象,而并不是迭代器! 1、range() 是什么? 對于 range() 函數,有幾個注…

centos下crontab的使用

1.作用使用crontab命令可以修改crontab配置文件,然后該配置由cron公用程序在適當的時間執行,該命令使用權限是所有用戶。2.格式crontab [-u user] {-l | -r | -e}3.crontab命令選項: -u指定一個用戶, -l列出某個用戶的任務計劃, -r刪除某個用戶的任務, -…

關于python3中的包operator(支持函數式編程的包)

文章目錄1.functools2.operator.itemgetter3.operator.attrgetter雖然 Guido 明確表明,Python 的目標不是變成函數式編程語言,但是得益于 operator 和 functools 等包的支持,函數式編程風格也可以信手拈來。接下來的兩節分別介紹這兩 個包。 1.functools 示例1 使用 reduce 函…

collections 中的namedtuple

文章目錄namedtuple 基本用法namedtuple特性_make(iterable)_asdict()_replace(**kwargs)_fields_fields_defaults參考:namedtuple 基本用法 Tuple還有一個兄弟,叫namedtuple。雖然都是tuple,但是功能更為強大。對于namedtuple,你…

abap 中modify 的使用

1、modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作區wa 中關鍵字的一條數據的 f1 f2字段會被wa中對應的字段值更新。 modify用于更新和新增數據,當表中沒有數據時就新增,有就修改。 2、在使用binary search 時一定要先排序&am…

python[進階] 6.使用一等函數實現設計模式

文章目錄6.1.1 經典的“策略”模式6.1.2 使用函數實現“策略”模式6.1.3 選擇最佳策略:簡單的6.1.4 找出模塊中的全部6.2 “命令”模式6.1.1 經典的“策略”模式 為抽象基類(Abstract Base Class,ABC),這么做是為了使…

2014阿里巴巴校園招聘筆試題 - 中南站

轉載于:https://www.cnblogs.com/gotodsp/articles/3530329.html

python中一些特殊方法的作用

我們先暫且稱呼為特殊方法。 單下劃線開頭(_foo)雙下劃線開頭的(__foo)雙下劃線開頭和結尾的( __foo__)代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用“from xxx im…

Spring的IOC原理[通俗解釋一下]

1. IoC理論的背景 我們都知道,在采用面向對象方法設計的軟件系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。 圖1:軟件系統中耦合的對象 如果我們打開機械式手表的后蓋&am…

python爬蟲面試遇到的問題

文章目錄1python基礎1.1 列表生成式和生成器的區別 ?1.2 如何不用任何循環快速篩掉列表中的奇數元素 ?1.3 map和reduce的用法1.4 裝飾器的作用1.5 Python中__new__與__init方法的區別1.6 python中的設計模式1.7 lambda函數,以及它…

ubuntu18 常用命令

文章目錄卸載和安裝卸載和安裝 1.打開一個終端,輸入dpkg --list ,按下Enter鍵,終端輸出以下內容,顯示的是你電腦上安裝的所有軟件。 2.安裝 dpkg –i name.deb 安裝一個 deb 包;在終端上輸入命令sudo apt-get --purge remove 包…

以嵌入式系統設計師考試成績,開始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 轉載于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介紹 1.2. SSH框架配置 所需資源下載: l jdk; 從Oracle官方網站:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下載jdk,win7是默認安裝在C:\Program Files (x86)\Java\jdk1.6.0_25路徑下…

cookie,session的區別和聯系(補充token)

文章目錄1 http為什么是無狀態的2 cookie 和session 的區別詳解3 token參考:備注: 博客文章僅限于學習,禁止商用1 http為什么是無狀態的 2 cookie 和session 的區別詳解 這些都是基礎知識,不過有必要做深入了解。先簡單介紹一下。 二者的定…

庫函數和系統調用的區別

前言 這是一對非常容易混淆的概念。對于用戶( 應用程序開發者 )來說,并不一定要嚴格區分其意義。因為在用戶看來,它們都是以C函數的形式出現的。但了解二者的區別對我們掌握整個計算機系統有很大幫助。 區別 1. 一部分庫函數實現需要使用系統調用( 如 pr…