簡體   English   中英

Android中的線程

[英]Threading in Android

我目前正在開發Android應用程序,它需要從互聯網下載內容。 我使用線程來執行該操作,然后調用runOnUiThread方法來更新GUI。

  1. 我在其上放置了一個刷新菜單,如果用戶嘗試刷新內容,則會創建並啟動下載線程。 問題是我如何控制線程順序,我需要接受最新請求的響應並放棄先前的線程請求,如果還有其他請求仍在運行,因為請求參數可能已被用戶更改。 目前我正在使用threadId來做這件事,當一個線程完成時,它會檢查它的threadId,如果它是最新的一個,它然后接受控制並呈現響應。 我的問題是,還有其他適當的更好的解決方案嗎?
  2. 用戶退出應用程序時是否需要停止線程? 我記得有些書說不要手動嘗試停止線程並等待自己完成是一個很好的做法,是真的嗎? 我應該通過調用“停止”或“中斷”方法來阻止它們嗎?
  3. 我在Android中閱讀了一些圍繞線程的文檔並發現了HandlerThread類,它是什么? 在什么樣的情況下我需要使用它?

我不是為每個刷新操作啟動一個新線程,而是為所有后台下載工作創建一個單獨的線程,循環和下載隊列中排列的內容。 這可確保您不會同時下載內容並節省資源。

在GUI中,您只需在用戶提示時排隊刷新請求,並可以通過在http方法實例上調用HttpRequestBase.abort來中止正在運行的下載。 后台線程應該接收並捕獲SocketException並繼續執行下一個排隊請求。

要結束后台線程,您只需結束其循環。 您可以使用LooperHandler類來幫助您完成上述所有操作,您提到的HandlerThread類只是一個方便的類來創建一個具有Looper的線程。

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

我發現本周AsyncTask,我在我的程序中的某個地方用AsyncTask替換了Thread,
你在這里有doc和sample,非常好用:
http://developer.android.com/reference/android/os/AsyncTask.html
當我使用線程GUI是鎖定,現在它沒有鎖定。
並且可以取消AsyncTask(但我從不嘗試)

您可以使用IntentService來啟動后台操作,該服務將作為“工作隊列處理器”運行,並將按順序執行您的調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM