2013-07-13 55 views
1

我有一個類AsycnIntegerCounter,它延伸AsyncTask,其中doInBackground()和重寫在相同的。 在我的主線程中,我可以創建一個可運行對象並使用 AsycnIntegerCounter的靜態執行方法執行它。 AsycnIntegerCounter.execute(Runnable)在Asynctask中執行runnable

任何人都可以幫助我理解當我們使用AsycnIntegerCounter(即使用AsycnTask對象)執行可運行時會發生什麼。

什麼時候可以使用?有什麼好處,而不是使用Thread對象來運行?

代碼示例:

AsycnIntegerCounter integerCounter1 = new AsycnIntegerCounter(next,0); 

AsycnIntegerCounter.execute(new Runnable() { 

      @Override 
      public void run() { 

       int i = 100; 
       while(i<=105){ 

        i++; 
        try { 
         Thread.sleep(1000); 

        } catch (InterruptedException e) { 

         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
+0

沒有稱爲AsyncIntegerCounter的類,它是您創建的自定義類嗎? –

+0

是的Onur,它是一個擴展AsyncTask的類,我在這個問題中提到了它。 – Pravy

回答

1

這是一樣​​但它會運行Runnable在後臺的,而不是運行doInBackround功能。當你有相同的onExExcute和onPostExecute,但有幾個可運行的時候,它會很有用。

我想Thread.executeExecutor的優勢正好在前後調用onPreExecuteonPostExecute

+0

感謝您回覆Alex,但我無法理解以下部分:「當您具有相同的onExExcute和onPostExecute但可運行多個Runnable時,它可能很有用。」 另外,當我使用execute()控件執行runnable時,在runnable完成其任務後,它不會轉到AsycnIntegerCounter類的onPostExecute(),這是預期的行爲嗎? – Pravy

1

至於我想,這就像AsyncTask類,但AsynchTask只運行一次,但與此類它提供了兩個東西 - :

  1. 它循環所以它的好處,如果你想有一個任務運行多個時間 就像檢查Web服務上的連續數據一樣。
  2. 它用Thread.sleep修正了一個任務的運行時間,所以如果一個任務早些時候完成了 它將會修復這個任務的時間Thread.wait()
1

@Alex是一個很好的觀點。假設你有很多方法,M1(),M2(),等等,你想執行。假設在執行它們之前,您需要執行方法Before()並且在您需要執行方法After()之後。

即,方法的程序進行:

Before(); 
M1(); 
After(); 

或者

Before(); 
M2(); 
After(); 

通過投入onPreExecuteBefore()After()onPostExecute就可以實現該序列。通過使M一個可運行的,你就可以實現:

Before(); 
WhateverRunnableYouWant(); 
After(); 

隨着Runnable的背景下,非UI,螺紋,按你的代碼。

+0

感謝Neil,但是當我使用execute方法執行runnable時,控件永遠不會去onPostExecute()或onPreExecute()。我應該在這種情況下添加任何代碼來調用它們嗎? – Pravy

+0

您可以發佈'AsycnIntegerCounter'請幫助回答,謝謝。 –

4


static void execute(Runnable) 


AsyncTask execute(Params...) 
  1. 之間的一對夫婦的根本區別後臺任務是Runnable的定義,而不是實現doInBackground
  2. Runnable -task不使用內部線程通信機制的AsyncTask。因此,既不調用onPreExecute也不調用onPostExecute
  3. 後者是適用於所有平臺,而第一次是在API級別增加11

使用execute(Runnable)的優點是該任務可以在內部線程池,即一個工作線程來執行不需要創建新的線程。

+0

謝謝有關信息AndersGransson – Pravy

+0

什麼是工作者線程? –