web-dev-qa-db-fra.com

Exécution simultanée de plusieurs tâches AsyncTask

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 });
29
Srht

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();
}

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 );
56
Marcin Orlowski

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.

0