J'utilise Android SDK 4.0.3 API15 et je veux exécuter plusieurs AsyncTasks en parallèle. J'obtiens mes données du serveur Web et les anime (10 ips) en temps réel. Mais en fonction de sur les opérations utilisateur, je dois également envoyer des données au serveur Web. Lorsque cela se produit, mon animation s'arrête pendant une courte période (l'envoi de données entre dans la file d'attente et l'obtention des données attend la fin) et je ne peux donc pas capturer le temps réel.
Cette réponse est assez explicative mais je n'ai pas pu le faire fonctionner. Donc, toute aide sera très appréciée.
Je pense que je dois utiliser cette fonction pour y parvenir:
AsyncTask.executeOnExecutor(Executor exec, Params... params)
Mais je ne peux pas passer d'exécuteur en paramètre et je ne peux pas instancier d'exécuteur. Voici ma classe 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();
}
}
Et je l'exécute comme ceci:
GetPlayers task = new GetPlayers();
requestString = "web adress is here...";
task.execute(new String[] { requestString });
Voici comment je fais ça:
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}
où MyAsyncTask
est une sous-classe AsyncTask régulière. Ou vous pouvez envelopper tout cela dans une classe d'assistance:
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);
}
}
}
puis faites simplement:
TaskHelper.execute( new MyTask() );
ou
TaskHelper.execute( new MyTask(), args );
ou
TaskHelper.execute( new MyTask(constructorParams), args );
Ce problème m'est apparu lorsque la mise à jour de mon application dans AndroidStudio vers le SDK 25 d'Intelliy à l'aide de Android 2.3 Juste le petit changement (executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, string1, ...);) fonctionne parfaitement) J'ai une AsyncTask exécutée dans un service à télécharger et je crée des AsyncTasks à télécharger dans aucun service.