2012-08-28 20 views
28

Utilizzo Android SDK 4.0.3 API15 e voglio eseguire più AsyncTasks in parallelo. Sto recuperando i miei dati da server web e animazione (10 fps) in tempo reale. Ma a seconda delle operazioni dell'utente, devo anche inviare alcuni dati al web server. In questo caso, la mia animazione si interrompe per un breve periodo (l'invio dei dati viene messo in coda e il download dei dati attende che finisca) e quindi non riesco a catturare il tempo reale.Esecuzione simultanea di più asyncTask

Questo answer è abbastanza esplicativo ma non ho potuto farlo funzionare. Quindi qualsiasi aiuto sarà molto apprezzato.

Penso di aver bisogno di usare questa funzione per raggiungere questo:

AsyncTask.executeOnExecutor(Executor exec, Params... params) 

ma non posso passare un esecutore come un parametro e non posso istanziare un esecutore. Questa è la mia 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(); 
    } 
} 

E io eseguirlo in questo modo:

GetPlayers task = new GetPlayers(); 
requestString = "web adress is here..."; 
task.execute(new String[] { requestString }); 
+0

Cosa intendi per 'non passare un esecutore come parametro e non posso istanziare un esecutore'.? Hai controllato developer.android.com/reference/java/util/concurrent/Executor.html, http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html? Quale esatto esecutore stai cercando di usare? – sandrstar

+0

In realtà non ho molta esperienza con gli Executor. Così ho provato a istanziare la classe Executor. Per quanto ho capito dal link ho bisogno di utilizzare ThreadPoolExecutor. Lo cercherò. Grazie. – Srht

+0

Giusto, Executor è solo un'interfaccia e non può essere istanziato. Puoi consultare la sezione "Sottoclassi Indiretti conosciuti" dei documenti Executor per gli esecutori presentati. Tuttavia, quello tipico sembra essere ThreadPoolExecutor. – sandrstar

risposta

55

Questo è come lo faccio:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} else { 
    new MyAsyncTask().execute(); 
} 

dove MyAsyncTask è regolare sottoclasse AsyncTask. Oppure si può avvolgere tutto questo in classe helper:

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

e poi basta fare:

TaskHelper.execute(new MyTask()); 

o

TaskHelper.execute(new MyTask(), args); 

o

TaskHelper.execute(new MyTask(constructorParams), args); 
+0

Come posso passare il mio argomento a quello. Come questo? nuovo MyAsyncTask(). executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, new String [] {requestString}); – Srht

+0

Si prega di iniziare SEMPRE con la documentazione SDK. Non è perfetto, tuttavia è utile .. Su 'executeOnExecutor()': http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20Params. ..% 29 in modo da poter passare i parametri –

+0

Ho visto e letto quello prima di fare la domanda, ma non sapevo come usarlo. Ho provato ad aggiungere 'executeOnExecutor (Executor exec, Params ... params)' alla mia definizione di classe e per quanto tu possa immaginare che non ha funzionato. Sono un principiante ma sto cercando di fare le cose da solo. In questo caso, semplicemente non conosco (e non ho potuto trovare) l'uso corretto di questo: 'new MyAsyncTask(). ExecuteOnExecutor (AsyncTask.THREAD_POEC_EXECUTOR);' Quindi grazie per queste informazioni che hanno funzionato come un miracolo. E per favore non essere frustrato :) – Srht

0

Questo problema si è verificato a me , quando aggiorno la mia app in AndroidStudio a sdk 25 da Intelliy utilizzando Android 2.3 Solo la piccola modifica (executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, string1, ...);) funziona perfettamente. Ho un AsyncTask in esecuzione in un servizio per il download e creare AsyncTasks per il caricamento in nessun servizio.

Problemi correlati