2014-06-20 78 views
1

我對Android中的多線程有點困惑。我知道我們可以使用AsyncTaskHandler來實現。通常我們應該在Android中通過擴展線程類來實現?任何人都可以舉一個例子,我們只需要通過擴展線程類來完成它,但不能使用AsyncTaskHandlerAndroid多線程和服務

  1. 考慮一個示例應用程序,在活動中,我們有一個反彈球(忘了動畫部分),我需要改變每20分鐘球的顏色,我需要從顏色代碼服務器並更新球UI。現在我怎麼能做到這一點?有人可以解釋使用AsyncTaskHandler,也只能使用線程類(沒有AsynctaskHandler)?

  2. 我應該如何處理使用服務從服務器下載大型有效載荷。

回答

0

AsyncTask基本上是一個線程。它有3種回調方法(主)和以該順序從上到下執行:

1. onPreExecute() 
2. doInBackground() 
3. onPostExecute() 
4. onProgressUpdate() 

onPreExecute()onPostExecute()被UI線程上運行,並且doInBackground()是一個單獨的線程本身。如果你產生了一個線程(不是AsyncTask),並嘗試從它設置一個UI元素的屬性,這將引發一個異常,說:創建視圖的原始線程(UI線程)只能修改它。因此,只有在UI線程擁有這兩個屬性:

  1. 只有它可以添加/修改應用程序的UI
  2. 它無法阻止超過5秒(ANR除外)

所以爲了一舉解決這兩個限制,我們有AsyncTask,它可以在doInBackground()中運行資源消耗操作(網絡訪問,實現遊戲邏輯等),並且仍然提供從onPreExecute()onPreExecute()onPreExecute()更改UI的能力。

+0

嗨感謝您的回答,可以給你的彈跳球圖應用程序 – teekib

+0

獲取所有顏色代碼之前動畫開始並將它們保存在本地==>使用處理程序計數20分鐘==>最後獲取您的活動(this)的引用,this.runOnUIThread(new runnable())==>這裏只需更改球的顏色。 –

5

主題一般

  • 調用

    • 長期任務的線程。start()方法
    • 從任何線程觸發
    • 運行在自己的線程
    • 手冊線程管理/代碼可能變得難以閱讀有

    的AsyncTask

    • 小任務與主線溝通
    • 通過excute()調用方法
    • 從主線程觸發輔助線程
    • 奔跑
    • 必須從主線程

    服務

    • 任務沒有UI執行和創建的,但不應該使用長期任務。使用服務內螺紋長期任務
    • 調用由onStartService()
    • 從任何線程觸發
    • 運行在主線程
    • 可能會阻止主(UI)線程

    IntentService

    • 長期任務通常不需要與主線程通信如果需要通信則是通過處理器進行或通過廣播意向
    • 調用
    • 從主線程觸發(原意是收到主線程和工作線程spawed)
    • 運行在單獨的線程
    • 不能並行,多任務運行意圖在同一個工作線程上排隊。
  • +0

    嗨感謝您的答案,可以給你彈跳球應用 – teekib

    +0

    你應該使用IntentService .... –

    0

    Thread:使用它從主線程(UI線程)中分離長時間運行的計算。如果您不需要更新UI或將消息發送回UI線程,請將其用於長時間運行的任務。 但是您並不需要擴展線程並通過重寫Thread方法來編寫邏輯。但與Thread相比,HandlerThread仍然有效。

    AsyncTask:它被設計爲一個圍繞ThreadHandler的幫助類,並不構成通用線程框架。理想情況下應該使用AsyncTasks進行短操作(最多幾毫秒)。推薦5毫秒任務執行。

    Service:用它來處理網絡事務,播放音樂,執行文件I/O或與內容提供者交互,所有這些都在後臺進行。

    HandlerThread/Handler:A HandlerThread實際上是一個長時間運行的線程,它從隊列中抓取工作並對其進行操作。您甚至可以通過UI Thread的Handler將結果發送回UI Thread。

    在下面有詳細介紹職位看一看:

    Asynctask vs Thread vs Services vs Loader

    Handler vs AsyncTask vs Thread

    Creating Background Service in Android

    Android: Toast in a thread