【轉】 Pro Android學習筆記(九五):AsyncTask(4):執行狀況

目錄(?)[-]學習

  1. 兩個AsyncTask對象的運行狀況
  2. 屢次執行的異常

文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處:http://blog.csdn.net/flowingflying/測試

兩個AsyncTask對象的運行狀況

咱們看看喚起兩個AsyncTask對象的執行狀況:this

    private void testMultiMyLongTask(){
        MyLongTask task1 = new MyLongTask(this, "Multi One"); 
        task1.execute("MultiOne","my","dear","friends"); 
         
        MyLongTask task2 = new MyLongTask(this,  "Multi Two"); 
        task2.execute("MultiTwo","hello","world"); 
    }.net

初看這段代碼,咱們會想象着兩個task的worker線程會前後幾乎同時一塊兒運行,然而實際的測試結果是,task2的worker線程在等待task1的worker線程執行完後才運行,圖爲運行結果。線程

出現這種狀況,最合理的猜想就是這兩個worker線程實際是同一線程,這也很容易在log中驗證。對象

在Android的參考文檔對此有解釋:task從線程池中獲取線程,Android的不一樣版本有不一樣的處理方式,在最先的版本是同一後臺線程,後來改成容許多個task並行執行,而在HONEYCOMB以後又改回同一線程,避免並行執行引起的錯誤。blog

若是咱們必定須要並行執行,就是用executeOnExecutor(Executor, Params...),以下:開發

    private void testMultiMyLongTask(){
        MyLongTask task1 = new MyLongTask(this, "Multi One");
        task1.execute("MultiOne","my","dear","friends");
        
        MyLongTask task2 = new MyLongTask(this,  "Multi Two");
        //task2.execute("MultiTwo","hello","world");
        task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,"MultiTwo","hello","world");
    }文檔

執行狀況以下:get

屢次執行的異常

若是咱們建立了一個AsyncTask的對象,屢次執行execute()會報錯,以下圖所示,一個對象只能運行一次worker線程。

相關小例子源代碼可在Pro Android學習:AsyncTask小例子中下載。

相關連接: 個人Android開發相關文章

相關文章
相關標籤/搜索