AsyncTask 是否同时工作?
Does AsyncTask works simultaneously?
AsyncTask 是同时工作还是先到先得? .
例如,我有 3 个具有相同接口 class 和相同侦听器函数的 AsyncTasks。同时执行 3 个 AsyncTasks。来自 AsyncTasks 的哪个响应将显示在 listener 函数中?
疑问:
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<Void, Void, Void>
{
@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<Void, Void, Void>
{
@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()
不同功能的相同 asyncTask,例如 api 请求:
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 的 onPreExecute()在每个 AsyncTask 运行s 的 doInBackground() 方法同时执行后,以先到先得的方式执行。
所以如果你正在执行
new FirstAsyncTask().execute();
new SecondAsyncTask().execute();
然后 FirstAsyncTask() 的 onPreExecute() 将完成其执行并启动 FirstAsyncTask() 的 doInBackground(),这将在后台执行,现在 SecondAsyncTask() 将执行它的 onPreExecute 并且完成后它也会执行 doInBackground() 的 SecondAsyncTask()。现在,第一个和第二个异步任务的 doInBackground() 将同时 运行。
AsyncTask 是同时工作还是先到先得? .
例如,我有 3 个具有相同接口 class 和相同侦听器函数的 AsyncTasks。同时执行 3 个 AsyncTasks。来自 AsyncTasks 的哪个响应将显示在 listener 函数中?
疑问:
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<Void, Void, Void>
{
@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<Void, Void, Void>
{
@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()
不同功能的相同 asyncTask,例如 api 请求:
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 的 onPreExecute()在每个 AsyncTask 运行s 的 doInBackground() 方法同时执行后,以先到先得的方式执行。
所以如果你正在执行
new FirstAsyncTask().execute();
new SecondAsyncTask().execute();
然后 FirstAsyncTask() 的 onPreExecute() 将完成其执行并启动 FirstAsyncTask() 的 doInBackground(),这将在后台执行,现在 SecondAsyncTask() 将执行它的 onPreExecute 并且完成后它也会执行 doInBackground() 的 SecondAsyncTask()。现在,第一个和第二个异步任务的 doInBackground() 将同时 运行。