2011-06-14 68 views
1

我知道我的代碼由於其他症狀而以某種方式死亡,但即使我嘗試瞭解所有內容,但從來沒有任何消息。現在我已經通過使用連續的輸出語句縮小了它的範圍。HTTP Post完全退出線程,沒有發現異常,或者永遠掛起

String line = null; 
    try { 
     final HttpParams httpParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpParams, 30000);  
     DefaultHttpClient httpClient = new DefaultHttpClient(httpParams); 
     HttpPost httpPost = new HttpPost(url); 
     postDebugMessage("GlobalApplication", "Info", "Executing httppost"); 
     HttpResponse httpResponse = httpClient.execute(httpPost); 
     postDebugMessage("GlobalApplication", "Info", "Getting entity"); 
     HttpEntity entity = httpResponse.getEntity(); 
     postDebugMessage("GlobalApplication", "Info", "Converting to line"); 
     line = EntityUtils.toString(entity); //<- the bad one 
     postDebugMessage("GlobalApplication", "Info", "Conversion completed."); 
    } 
    catch (Exception ex) { 
     // Any error occurring here we're going to state is 
     // a network error. 
     postDebugMessage("GlobalApplication", "Exception", ex.getStackTrace()[0].toString()); 
     throw new NetworkNotAvailableException(ex.toString()); 

    } 

根據我的調試輸出語句,行= EntityUtils.toString(實體)永遠不會完成,之後在整個服務線程沒有執行語句......整個事情剛剛消失。我知道EntityUtils.toString()可以拋出2個異常,一個IOException和一個ParseException,我將嘗試添加下一個,但不應該一個整體的異常捕獲它嗎?

+0

是的,整個異常捕捉它,所以這不是問題。 – Kaj 2011-06-14 14:54:54

+0

yep都擴展java.lang.Exception,並被try/catch塊捕獲。什麼是你的網址?應該是什麼樣的反應?你能確保服務器響應你的期望嗎? – Stuck 2011-06-14 15:02:43

+0

我沿着「線路」進行操作。我現在做一個明確的檢查,看看是否從EntityUtils.toString()調用中出現空行。我實際上有一個try/catch(Exception)環繞的行操作,所以我想以後也會發現一個NPE。 – Rob 2011-06-14 15:19:09

回答

1

我打算回答這個問題,因爲我已經解決了它出現的問題,但它與EntityUtils調用沒有關係(至少據我所知)。

這不是一個完全退出線程的異常,它只是一個掛起的線程。罪魁禍首是我有一個連接超時,但不是套接字連接超時。文檔說默認值是無限的超時......這就是我所看到的我會說的。我補充說:

HttpConnectionParams.setSoTimeout(httpParams, 30000); 

從那以後還沒有看到過這個問題。

我知道至少有一個日誌顯示entityUtils調用永遠不會完成,所以這就是讓我認爲是這樣的情況,但之後的更多日誌顯示它是從未完成的.execute(httpPost),所以這就是是什麼讓我看起來那樣。

感謝您的幫助!

0

不一定。我懷疑你可能會得到一個擴展錯誤而不是異常的未經檢查的異常。嘗試把catch(Throwable t)看看它是否抓住它。您可能不希望實際上捕捉到這些異常,因爲如果系統狀態出現內存異常,系統狀態可能無法預測。

+0

然後他會得到一個崩潰報告。 – Kaj 2011-06-14 15:01:30

+0

我沒有得到任何形式的崩潰報告,並且該應用程序沒有FC ..繼續像正常一樣。我會添加catch(Throwable t)來看看我能得到什麼。如果我只讓設備運行足夠長時間,或者進入一個接收不穩定的區域,這似乎有點輕鬆可重複。 – Rob 2011-06-14 15:16:22

+0

我現在已經爲整個事情添加了大量的漁獲量。它在惡劣的環境中運行了很長時間,到目前爲止,它並沒有像以前那樣失敗。我看到的主要異常是IOException,其中操作超時。我沒有得到任何通用的拋出異常。我會繼續監控它,但是如果它從現在開始「完美無瑕」地工作,那麼看起來IOException似乎並沒有成爲一般的例外。或無限懸掛?我不知道。 – Rob 2011-06-14 18:29:10

0

EntityUtils.toString(entity)首先讀取一些數據,然後它這樣做:

char[] tmp = new char[1024]; 
int l; 
while((l = reader.read(tmp)) != -1) { 
    buffer.append(tmp, 0, l); 
} 

因此,作爲服務器發送更多數據的方法將長方框。我希望你沒有連接到流媒體服務?

+0

不,http響應是一個XML文件。 – Rob 2011-06-14 15:19:54

+0

你有一個喚醒鎖嗎? – Kaj 2011-06-14 17:49:04

+0

是的,直到完成。 – Rob 2011-06-14 18:26:15