2012-08-24 63 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();