2012-08-24 89 views
4

我已經實現了2個ASYN任務,我使用的Android4.0。其中一個asyntask連續執行,第二個則根據需要執行(可能是多次)。例如, 。執行串行順序異步任務的Android4.0

class AsynTask1 exetends AsyncTask<Void, Bitmap, Void>{ 
    protected Void doInBackground(Void... params) { 
     while(true){ 
      publishProgress(bmp); 
     } 
    } 
} 

class AsynTask2 extends AsyncTask<String, Void,Void>{ 
    protected Void doInBackground(String... params){ 
     System.out.println(params[0]) 
    } 
} 

在活動類

class MainActivity extends Activity{ 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     new AsynTask1().execute(); 

     int i=0; 
     while(i<100) 
     { 
      if(i%2==0) 
      new AsynTask2().execute("no is even"+i); 
      i++ 
     } 
    } 
}  

在不執行AsynTask2上述情況。

如果具有executeOnExecutor(AsyncTask.THREAD_POOL_Executor,則params)嘗試過,則兩個asyntask被執行,我從AsynTask2得到打印的消息,但這些都不是爲了(例如0 2 6 4 10 8 12 14 .. ..)。

是否有任何方式,使得順序(如0 2 4 6 8 10 12 14 ...。)防止了在順序連續且AsynTask2執行AsynTask1。

感謝&問候 小。使用回調

回答

4

使用SERIAL_EXECUTOR爲Asynctask2

new AsynTask2().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR ,"no is even"+i) 

編輯: 使用Asynctask1,使同一執行不使用

new AsynTask1().executeOnExecutor(AsyncTask.THREAD_POOL_Executor,params); 
+0

我試過這個,但是AsyncTask2沒有執行,所以我沒有從AsynTask2獲取消息。 ThreadPool對於所有的asyntasks都是一樣的嗎? – mini

+0

你是否僅對Asynctask2或Asynctask1執行此操作? – nandeesh

+0

我試過這兩個AsynTasks,後來我只嘗試了AsynTask2。 – mini

0

嘗試。定義AsyncTask類中的接口並在主類中實現它們。在AsyncTask2的onPostExecute上使用callBack來啓動下一個AsyncTask2。你會保證訂單。

class AsyncTask2 extends AsyncTask<String, Void,Boolean<{ 
     //Your code. doInBackground must now return a boolean. 
     protected Void onPostExecute(final Boolean success){ 
      myCallback listener = (myCallback) parentActivity; 
      listener.call(); 
     } 

     public Interface myCallback{ 
      void call(); 
     } 
} 

然後在您的主要活動中實現myCallback。

[編輯]

下面是你可以做的一個例子。

Class MainActivity extends Activity implements myCallback{ 
    //Your code 
    public void call(){ 
     new AsyncTask2().execute("no is even" + i); 
    } 
} 
+0

感謝您迴應的線程池來實現串行執行,但我不知道回調和它們的實現。 – mini

+0

檢查編輯。 –

-2
int i=0; 
    while(i<100) 
    { 
     new AsynTask1().execute(); 
     if(i%2==0) 
     { 
     new AsynTask2().execute("no is even"+i); 
     } 
     i++ 
    } 
+0

如果我用上面的一個,然後AsynTask1被稱爲每次迭代,我不想每次打電話每次迭代AsynTask1。 – mini

0
  1. 你不應該使用AsyncTa sk用於長時間運行的線程(您正在實現AsyncTask1的方式)。請參閱文檔:http://developer.android.com/reference/android/os/AsyncTask.html。只需爲AsyncTask1正在做的事情創建一個單獨的線程。

  2. 既然你需要知道你正在做什麼AsyncTask2可以通過創建尺寸1.

    // Creating ThreadPool 
    ExecutorService service = Executors.newFixedThreadPool(1); 
    
    // Submitting task 
    service.execute(task); 
    
    // Shutting down the thread pool when not required. 
    service.shutdown();