Выполнение нескольких асинхронных задач параллельно
Я использую Android SDK 4.0.3 API15, и я хочу запускать несколько AsyncTasks параллельно. Я получаю свои данные с веб-сервера и анимирует (10 кадров в секунду) в режиме реального времени. Но в зависимости от пользовательских операций мне также нужно отправить некоторые данные на веб-сервер. Когда это происходит, моя анимация приостанавливается на короткое время (отправка данных попадает в очередь и получение данных ждет ее завершения), и поэтому я не могу поймать в реальном времени.
Этот answer объясняет, но я не мог заставить его работать. Поэтому любая помощь будет очень оценена.
Я думаю, мне нужно использовать эту функцию для достижения этого:
AsyncTask.executeOnExecutor(Executor exec, Params... params)
Но я не могу передать исполнитель в качестве параметра, и я не могу создать экземпляр исполнителя. Это мой класс AsyncTask:
public class GetPlayers extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
rawData="";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse execute = client.execute(httpGet);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
if((rawData = buffer.readLine()) == null){
rawData = "error";
}
} catch (Exception e) {
e.printStackTrace();
}
}
return rawData;
}
@Override
protected void onPostExecute(String result) {
manipulate();
}
}
И я выполняю его следующим образом:
GetPlayers task = new GetPlayers();
requestString = "web adress is here...";
task.execute(new String[] { requestString });
Ответы
Ответ 1
Вот как я это делаю:
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}
где MyAsyncTask
- обычный подкласс AsyncTask. Или вы можете обернуть это все в вспомогательный класс:
class TaskHelper {
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);
}
}
}
а затем просто выполните:
TaskHelper.execute( new MyTask() );
или
TaskHelper.execute( new MyTask(), args );
или
TaskHelper.execute( new MyTask(constructorParams), args );
Ответ 2
Эта проблема возникла у меня при обновлении моего приложения в AndroidStudio до
sdk 25 от Intelliy с помощью Android 2.3
Просто небольшое изменение (executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, string1,...);) работает отлично.
У меня есть AsyncTask, запущенная в Службе для загрузки и
создайте AsyncTasks для загрузки без обслуживания.