文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處:http://blog.csdn.net/flowingflying/測試
咱們看看喚起兩個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開發相關文章