2010-06-13 41 views
9

我目前正在開發Android應用程序,它需要從互聯網上下載的內容。我使用線程來做到這一點,然後調用runOnUiThread方法來更新GUI。線程在Android的

  1. 我在其上放置了一個刷新菜單,如果用戶試圖刷新內容,下載線程將被創建並啓動。問題是如何控制線程順序,我需要接受最新的請求響應,並放棄以前的線程請求,如果還有其他請求仍在運行,因爲請求參數可能已被用戶更改。目前我正在使用threadId來完成這件事情,當一個線程完成時,它將檢查它的threadId,如果它是最新的被記錄的,那麼它會接受控制並呈現響應。 我的問題是,有沒有其他適當的更好的解決方案呢?
  2. 我是否需要停止線程時用戶退出應用程序?我記得有些書說不要手動停止線程,等待自己完成是一個好習慣,這是真的嗎?我應該通過調用「停止」還是「中斷」方法來阻止它們?
  3. 我看周圍的線程一些文件在Android和發現該類HandlerThread,是什麼呢?在什麼樣的情況下我需要使用它?
+1

這篇博文可能有幫助:http://foo.jasonhudgins.com/2010/02/rebel-without-context.html一個好主意博文是針對您的活動註冊/取消註冊下載完成「事件」的監聽器,您的服務可以觸發更新UI。 – 2010-06-18 21:26:27

回答

4

與其爲每個刷新操作啓動一個新線程,我都會爲所有後臺下載工作創建一個線程,以循環和下載隊列中的內容。這可以確保您不會同時下載內容並節省資源。

在GUI中你只需排隊每當用戶提示您,並可以通過調用HTTP方法實例HttpRequestBase.abort中止運行下載刷新請求。後臺線程應該接收並捕獲SocketException並轉到下一個排隊的請求。

要結束後臺線程你就必須結束其循環。您可以使用LooperHandler類來幫助您解決所有上述情況,你提到的HandlerThread類只是一個方便的類來創建具有Looper一個線程。

interrupt線程的問題在於,它不會使您脫離阻塞的I/O請求,並且正確處理InterruptException可能會很複雜。所以根據情況我會說是的,最好的做法是從run方法返回結束線程。

+0

如果我用looper創建了一個線程,我想它可以在隊列中排隊執行我的請求,那麼如果因爲我只需要最新結果而推入一個新請求,我該如何取消它們。 – virsir 2010-06-13 13:29:35

+0

你可以引用你的'HttpGet'並調用它的'abort'方法。還是你不使用'HttpClient'? – 2010-06-13 23:10:18

1

您可以使用IntentService開始後臺操作,服務將作爲「工作隊列處理器」運行,並按順序執行您的呼叫。