Возможно ли запустить одновременно несколько AsyncTask?
У меня есть два действия в моем приложении. В моей работе A Я использую одну AsyncTask, а вторую активность B также использует другую AsyncTask. В моей работе A Я загружаю некоторые данные на сервер и в свою активность B. Я пытаюсь загрузить некоторые другие данные с сервера. Оба они работают в AsyncTask. Моя проблема в том, что когда я пытаюсь загрузить данные с сервера в метод Activity B onPreExecute()
, но метод doInBackground()
не был вызван, он ожидает завершения первого действия A doInBackground()
. Почему это случилось? Возможно ли одновременно запускать несколько фоновых действий.
В действии A
ImageButton submit_button = (ImageButton) findViewById(R.id.submit_button);
submit_button.setOnClickListener(new OnClickListener()
{
public void onClick(View record_button)
{
new Save_data().execute();
}
});
class Save_data extends AsyncTask<String, Integer, Integer>
{
protected void onPreExecute()
{
}
protected Integer doInBackground(String... arg0)
{
//uploading data here
}
}
В моей деятельности B
ImageButton get_button = (ImageButton) findViewById(R.id.get_button);
get_button.setOnClickListener(new OnClickListener()
{
public void onClick(View record_button)
{
new download_process().execute();
}
});
class download_process extends AsyncTask<String, integer, integer>
{
protected void onPreExecute()
{
Log.e("pre-execute","has been called");//This Log works well
}
protected Integer doInBackground(String... arg0)
{
//downloading data here
}
}
Ответы
Ответ 1
использовать исполнитель следующим образом
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new Save_data().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location);
} else {
new Save_data().execute(location);
}
См. this
Ответ 2
Да, это так, но с Honeycomb там происходит изменение способа AsyncTask
на Android. Из HC + они выполняются последовательно, а не запускаются параллельно, как это было раньше. Решение состоит в том, чтобы вызвать их так (поместить его в отдельный класс инструментов или так):
public class AsyncTaskTools {
public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task) {
execute(task, (P[]) null);
}
@SuppressLint("NewApi")
public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task, P... params) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
} else {
task.execute(params);
}
}
}
а затем вы можете просто вызвать:
AsyncTaskTools.execute( new MyAsyncTask() );
или с параметрами (однако я скорее предлагаю passign params через конструктор задач):
AsyncTaskTools.execute( new MyAsyncTask(), <your params here> );