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()将同时运行。
- `无法在inheritance的Activity中创建处理程序… Looper.prepare()`
- 匿名上传File对象到Imgur API(JSON)给出了身份validation错误401
- 单击第1项时的Android CarouselPicker
- 找不到处理Execution default-proguard的市场条目
- 如何将数据库写入android中的文本文件
- Android – SQLite – 选择BETWEEN Date1和Date2
- 音量总是一样的吗?
- Android:将calcOpticalFlowPyrLK与MatOfPoint2f一起使用
- 如何花时间直到焦点在图像上拍摄而不是拍照?camera2API