2013-04-18 15 views
6

Sto lavorando a un'app che utilizza molti AsyncTask. Quando ho iniziato a partecipare alla codifica di questa app, targetSdkVersion era impostato su 10, quindi non abbiamo avuto problemi con gli AsyncTasks perché sono tutti eseguiti su thread in background paralleli. Dal momento che abbiamo impostato targtSdkVersion su 17 abbiamo alcuni problemi con le attività perché ora vengono eseguite su un singolo thread in background. Per risolvere questo problema ho trovato il seguente codice usare per specificamente le attività parallele:AsyncTask Android come argomento metodo

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

Ora, perché abbiamo diversi compiti che necessitano di queste righe di codice, vorrei scrivere un metodo nella nostra classe Utils che esegue le attività in questo modo ... ma non riesco a ottenere ciò, perché non posso passare i diversi compiti al metodo come argomento dovuto al parametro "Param | Progresso | Il risultato è diverso da un'attività all'altra. C'è un modo per raggiungere il nostro obiettivo? Qualche idea?

+0

si metodo può prendere un AsyncTask come param, penso – njzk2

+0

già provato, ma non ha funzionato ... sto ottenendo sempre : java.lang.ClassCastException: java.lang.Object [] non può essere lanciato su java.lang.Void [] –

risposta

9

Poiché AsyncTask è una classe parametrizzata, è necessario utilizzare i generici. Qualcosa di simile a questo:

@SuppressLint("NewApi") 
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); 
    } 
} 

Usa come questo:

MyAsyncTask task = new MyAsyncTask(); 
Utils.execute(task); 
+0

BAM! Lavori! Abbiamo anche provato qualcosa di simile, ma abbiamo sempre avuto la stessa eccezione ... quindi grazie mille per questa soluzione! :) –

+1

Sono stato anche in grado di farlo funzionare con la firma 'statica void execute (AsyncTask task, Params ... params)' –

Problemi correlati