天天看點

Android應用程式線程消息循環模型分析(6)

  我們可以通過mFuture對象來操作目前執行的任務,例如查詢目前任務的狀态,它是正在執行中,還是完成了,還是被取消了,如果是完成了,還可以通過它獲得任務的執行結果,如果還沒有完成,可以取消任務的執行。

        當工作任務mWorker執行完成的時候,mFuture對象中的done函數就會被被調用,根據任務的完成狀況,執行相應的操作,例如,如果是因為異常而完成時,就會抛異常,如果是正常完成,就會把任務執行結果封裝成一個AsyncTaskResult對象:

 其中,成員變量mData儲存的是任務執行結果,而成員變量mTask指向前面我們建立的AsyncTask對象。

        最後把這個AsyncTaskResult對象封裝成一個消息,并且通過消息處理器sHandler加入到應用程式主線程的消息隊列中:

  這個消息最終就會在InternalHandler類的handleMessage函數中處理了:

   在這個函數裡面,最終會調用前面建立的這個AsyncTask對象的finish函數來進一步處理:

      這個函數調用AsyncTask類的onPostExecute函數來進一步處理,AsyncTask類的onPostExecute函數一般是要由其子類來重載的,注意,這個函數是在應用程式的主線程中執行的,是以,它可以操作應用程式的界面。

        在任務執行的過程當中,即執行doInBackground函數時候,可能通過調用publishProgress函數來将中間結果封裝成一個消息發送到應用程式主線程中的消息隊列中去:

   這個消息最終也是由InternalHandler類的handleMessage函數來處理的:

   這裡它調用前面建立的AsyncTask對象的onPorgressUpdate函數來進一步處理,這個函數一般是由AsyncTask的子類來實作的,注意,這個函數是在應用程式的主線程中執行的,是以,它和前面的onPostExecute函數一樣,可以操作應用程式的界面。

       這樣,AsyncTask類的主要實作就介紹完了,結合前面開發的應用程式Counter來分析,會更好地了解它的實作原理。

       至此,Android應用程式線程消息循環模型就分析完成了,了解它有利于我們在開發Android應用程式時,能夠充分利用多線程的并發性來提高應用程式的性能以及獲得良好的使用者體驗。