2015-11-04 257 views
0

我正在研究一個大型應用程序的代碼。有在UI中使用3種異步模式,所有這些似乎等效:AsyncTask vs Activity.runOnUiThread()vs Handler.post()

模式1,的AsyncTask

new AsyncTask<X, Void, Z>() { 
    protected Boolean doInBackground(X... params) { 
     //background task 
    } 

    protected void onPostExecute(Z res) { 
     //UI callback 
    } 
}.execute(); 

模式2,Activity.runOnUiThread(可運行)

new Thread() { 
    public void run() { 
     //background task 

     runOnUiThread(new Runnable() { 
      public void run() { 
       //UI callback 
      } 
     }); 
    } 
}.start(); 

模式3,Handler.post(Runnable)

new Thread() { 
    public void run() { 
     //background task 

     handler.post(new Runnable() { 
      public void run() { 
       //UI callback 
      } 
     }); 
    } 
}.start(); 

問題:

  • 3種模式,我缺少什麼區別呢? (除了AsyncTask在具有後臺優先級的預先存在的線程池上運行)。
  • 任何情況下哪個特定模式更受歡迎?

回答

2

他們都是真的Handler明顯或內部。

AsyncTask#finish()調用從Handler消息循環中調用。

runOnUiThread()如果當前線程不是UI線程,則將Runnable發佈到Handler。如果它是UI線程,則可以同步執行runnable - 這並不總是可取的。

直接使用Handler可以爲您提供低級別的控制,並且僅限於此。

要使用什麼取決於您的具體要求。