2013-04-18 15 views
6

Ich arbeite an einer App, die viele AsyncTasks verwendet. Als ich anfing, an der Programmierung dieser App teilzunehmen, wurde targetSdkVersion auf 10 gesetzt, also hatten wir keine Probleme mit den AsyncTasks, weil sie alle auf parallelen Hintergrundthreads ausgeführt wurden. Da wir die targtSdkVersion auf 17 gesetzt haben, haben wir einige Probleme mit den Aufgaben, da sie jetzt auf einem einzigen Hintergrund-Thread ausgeführt werden. Zur Lösung dieses Problems habe ich den folgenden Code gefunden speziell parallele Aufgaben zu verwenden:Android AsyncTask als Methode Argument

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

Jetzt, da wir mehrere Aufgaben haben diese Zeilen Code benötigen, würde Ich mag eine Methode in unserer eigenen Utils-Klasse schreiben, die führt die Tasks auf diese Weise aus ... aber das kann ich nicht erreichen, weil ich die verschiedenen Tasks aufgrund der 'Param | Fortschritt | Die Ergebnisse unterscheiden sich von einer Aufgabe zur anderen. Gibt es eine Möglichkeit, unser Ziel zu erreichen? Irgendwelche Ideen?

+0

Sie Methode kann eine AsyncTask als param nehmen, denke ich – njzk2

+0

schon versucht, aber hat nicht funktioniert ... Ich bin immer immer : java.lang.ClassCastException: java.lang.Object [] kann nicht in java.lang.Void umgewandelt werden [] –

Antwort

9

Da AsyncTask eine parametrisierte Klasse ist, müssen Sie Generika verwenden. Etwas wie folgt aus:

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

Verwendung wie folgt aus:

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

BAM! Funktioniert! Wir haben auch so etwas probiert, aber wir haben immer die selbe Ausnahme ... also vielen Dank für diese Lösung! :) –

+1

Ich konnte auch mit der Signatur 'static void ausführen (AsyncTask task, Params ... params) arbeiten lassen –