2015-11-04 263 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可以为您提供低级别的控制,并且仅限于此。

要使用什么取决于您的具体要求。