AsyncTask是否同时工作?

AsyncTask是同时工作还是以先到先得的方式工作? 。

例如,我有3个具有相同接口类和相同侦听器function的AsyncTasks。 同时执行3个AsyncTasks。 AsyncTasks的哪些响应会在监听器function中显示?

释疑:

1. AsyncTasks是以并行还是先到先得的方式运行的? 2.如果AsyncTasks以并行方式运行,如何为所有AsyncTasks处理相同的侦听器函数?

Nb :怀疑2是因为在不使用AsyncTask的情况下同时执行多个请求时收到第一个响应。 ( Web Api响应 )。

提前致谢。

对于多个请求,您可以使用ThreadPoolExecutor

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { new callApi().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location); } else { new callApi().execute(location); } 

线程池模式

AsyncTask使用线程池模式来运行doInBackground()中的东西

线程池模式是创建线程数以执行许多任务的位置。 它基本上是一个容器,其中多个线程进入队列以执行不同的任务。

例如:

 public class MultipleAsyncTask extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); runMultipleAsyncTask(); // Start Async Task } private void runMultipleAsyncTask() // Run Multiple Async Task { FirstAsyncTask asyncTask = new FirstAsyncTask(); // First if(AppUtil.isCurrentVersionHoneycombAndAbove()) // Above Api Level 13 { asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else // Below Api Level 13 { asyncTask.execute(); } SecondAsyncTask asyncTask2 = new SecondAsyncTask(); // Second if(AppUtil.isCurrentVersionHoneycombAndAbove())// Above Api Level 13 { asyncTask2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else // Below Api Level 13 { asyncTask2.execute(); } } //Start First Async Task: private class FirstAsyncTask extends AsyncTask { @Override protected void onPreExecute() { Log.i("AsyncTask" ,"FirstOnPreExecute()"); } @Override protected Void doInBackground(Void... params) { for(int index = 0; index < 50; index++) { Log.i("AsyncTask" ,"FirstAsyncTask"); try { Thread.sleep(100); } catch (InterruptedException exception) { exception.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { Log.d("AsyncTask" ,"FirstonPostExecute()"); } } //Start Second Async Task: private class SecondAsyncTask extends AsyncTask { @Override protected void onPreExecute() { Log.i("AsyncTask" ,"SecondOnPreExecute()"); } @Override protected Void doInBackground(Void... params) { for(int index = 0; index < 50; index++) { Log.d("AsyncTask" ,"SecondAsyncTask"); try { Thread.sleep(100); } catch (InterruptedException exception) { exception.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { Log.d("AsyncTask" ,"SecondOnPostExecute()"); } } } 

输出:

 FirstOnPreExecute() SecondOnPreExecute() FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstAsyncTask SecondAsyncTask FirstonPostExecute() SecondOnPostExecute() 

与asi请求等不同函数相同的asyncTask:

 boolean flag; @Override protected String doInBackground (String... params) { flag= params[0].endsWith("/repos"); //other statements } 

现在在你的onPostExecute中:

 if(flag){ //parse one way } else { //parse another way } 

我同意Hemant Parmar给出的答案,但是在每个AsyncTask的 doInBackground()方法同时运行之后,还有一些事情要知道每个AsyncTask的 onPreExecute()以先来先服务的方式执行。

所以,如果你正在执行

new FirstAsyncTask().execute();

new SecondAsyncTask().execute();

然后, FirstAsyncTask()的onExreExecute()将完成其执行,并将启动将在后台执行的FirstAsyncTask()的doInBackground(),现在SecondAsyncTask()将执行其onPreExecute,并且在完成后它也将执行SecondAsyncTask的doInBackground() ()。 现在, fisrt和第二个异步任务的doInBackground()将同时运行。