Возможно ли запустить одновременно несколько AsyncTask? - программирование
Подтвердить что ты не робот

Возможно ли запустить одновременно несколько 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
        }   
     }
4b9b3361

Ответ 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> );