2012-01-22 34 views
1

我正在使用Apache Commons來進行HTTP調用,而在我的活動中,我有一個線程可以進行調用。如果通過設備撥打電話並等待連接(假設網絡擁塞並且通話需要一些時間),並且同時用戶退出應用程序,並且該活動是後臺接入的。我的電話會發生什麼?對於這個問題(想一想)在活動中啓動的任何線程會發生什麼?如果我有一個線程坐在那裏,做它的事情(不管它是什麼),並且活動已關閉,我是否必須自己處理onPause()來處理線程?如果正在運行的活動已關閉,那麼活動HTTP調用會發生什麼情況?

編輯... 因此,考慮到Ted Hopp的回答,什麼是殺死Apache請求的正確方法?我正在瀏覽Commons documentation,並且有很多方法*看起來像他們會這樣做,但由於文檔缺乏細節(如果您不打算指定某些內容,爲什麼還要打擾文檔? !)我想知道哪些方法,我應該調用我的HttpConnection對象之前,殺死我的連接正在坐在線程?

回答

2

關閉活動對活動託管過程沒有直接影響。所有其他線程繼續運行。您應該重寫一個或多個life cycle方法(,onDestroy等)以檢測活動正在結束並中斷或以其他方式終止正在運行的線程。活動方法isFinishing()可用於區分正在關閉的活動和由於配置更改而正在銷燬和重新啓動的活動。

你的線程應該寫入一個方法來取消執行。特別是使用apache-commons時,該方法應該有兩個步驟。首先,你應該調用abort()來傳遞給你的方法HttpClient.execute()。其次,你應該關閉連接本身:

client.getHttpConnectionManager() 
    .getConnection(client.getHostConfiguration()).close(); 

其實,如果你做到這最後一步,實際應該足以扔在方法的IOException並停止一切。

+0

太棒了...那麼再問一下我的Apache問題的具體情況,我該如何去處理HTTP請求呢? –

+0

如果線程在網絡請求上被阻塞,最好讓它運行其過程而不是主動嘗試殺死線程或HTTP請求。您不僅可以從應用程序中拯救應用程序,而且還可以保存服務器。只要確保你的線程在HTTP請求返回後找到Activity不見了,就會正常退出。 –

+0

@Barry Fruitman,我聽到你的聲音,但在我的具體情況下,我真的不希望服務器最終因爲滯後的請求而被默默地擊中。如果它不會有客戶迴應,我寧願它只是沒有通過。 –

0

Google強烈建議開發者不要在Activity中進行HTTP調用。 Service是推薦的型號。 Android應用程序將因許多原因而暫停。一些最常見的情況是接聽電話,短信或電子郵件。我懷疑你是否想要取消呼叫,因此用戶在他/她返回時再次等待,可能全部發生在後臺。

最好的選擇是使用ServiceIntentService來進行調用並保存數據(可能是SQLite數據庫)。當Activity恢復時,它可以簡單地檢查數據庫中的新條目。

如果您還沒有看到它,請查看Google I/O 2010中的「Developing Android REST Client Applications」。請務必注意PDF下載鏈接。

+0

謝謝,我實際上知道這一切,但不幸的是,在這種特殊情況下需要通過活動進行調用,事實上,用戶的離開是需要在連接中斷時終止連接的事情中轉。重要的是,在大多數情況下,響應不會被服務反應所吞噬,因爲同一個用戶不會回來(這是一個自助服務終端應用程序的自定義應用程序,將被大量不同的用戶使用)。所以,雖然我同意你的一般論證的前提,但它不適用於我的案子。 –

相關問題