AsyncTask - Verständnisproblem

  • 4 Antworten
  • Letztes Antwortdatum
B

bandchef

Neues Mitglied
0
Hi Leute!

Ich hab ein kleines Verständnisproblem mit dem AsyncTask. Hier erst mal eine korrekte Implementierung eines AsyncTasks:

Code:
private class MyTestAsyncTask extends AsyncTask <Integer, Long, String>
    {
        @Override
        protected String doInBackground(Integer... params)
        {
            String test = "42";
            return test;
        }
        
        @Override
        protected void onProgressUpdate(Long... params)
        {
            long test = 5;
            test = test + 1;
            //return null;
        }
    }
Die Methode onProgressUpdate bereitet mir kopfzerbrechen!

1. Frage: Warum akzeptiert er keinen anderen Datentyp außer void für den Rückgabewert von onProgressUpdate?
2. Frage: Wenn ich in der doInBackground-Methode als Rückgabedatentyp ein void schreibe, dann verlangt er ein "return void;"; wenn ich aber das "return void;" in der onProgressUpdate-Methode mit void als Rückgabewert schreibe, markiert mir Eclipse das als Fehler! Warum???
3. Frage: Warum Muss ich die Rückgabedatentypen (er akzeptiert ja anscheinend eh nur void!) der onProgressUpdate-Methode klein (void) schreiben, hingegen den Rückgabedatentyp der doInBackground-Methode groß- (Void, Integer, String, ...) und vor allem AUSschreiben? Das kenne ich persönlich von keiner anderen Programmiersprache...

Danke!
 
Weil das eine Void ein Objekt ist, besser gesagt, es wird ein Objekt vom Typ Void zurück erwartet ;)
und das andere das "ganz normale" Java void.

lg. Dagobert
 
Die Entwickler von Android wollten den AsyncTask so generell wie möglich halten. Ganz einfach gesagt ist es so definiert:

  1. doInBackground erhält Objekte als Parameter und gibt ein Objekt zurück
  2. onProgressUpdate erhält Objekte als Parameter und gibt nichts zurück
  3. onPostExecute erhält ein Objekt (von doInBackground) und gibt nichts zurück

die jeweiligen Typen der Objekte kann der Programmierer innerhalb der spitzen Klammern selber wählen:

Code:
private class MyTestAsyncTask extends AsyncTask <[B][U]Integer, Long, String[/U][/B]>

Bei onProgressUpdate ist also schon definiert, dass nichts zurückgegeben werden kann: In Java benutzt man dafür void. Und weil das so vorgeschrieben ist, kann man da nichts anderes wählen.

Bei doInBackground ist aber definiert, dass ein Objekt zurückgegeben werden muss. Wenn jetzt ein Programmierer aber mal nichts zurückgeben will, hat er ein Problem, weil ja vorgeschrieben ist, dass er etwas zurückgeben muss. Hier kann man dann die Klasse Void benutzen. Man gibt dann ein (leeres) Objekt zurück, aber sagt indirekt auch aus, dass man eigentlich gar nichts zurückgeben wollte ;)
 
Zuletzt bearbeitet:
Dich verwirrt scheinbar nicht der AsyncTask an sich sondern die Generics die wort verwendet werden.

Normalerweise (bzw früher) war sowas gar nicht Möglich, dann wären das vermutlich alles einfach nur "Object" gewesen.

Würde dann so aussehen:
protected Object doInBackground(Object... params)
protected void onProgressUpdate(Object... params)

Das void bleibt aber, da das so in AsynTask definiert ist.
Warum willst du überhaupt dort was zurück geben?
Das wird ja nirgendwo verarbeitet.
Direkt aufrufen muss man die Methode auch nicht.
 
Zoopa schrieb:
  1. doInBackground erhält Objekte als Parameter und gibt ein Objekt zurück
  2. onProgressUpdate erhält Objekte als Parameter und gibt nichts zurück
  3. onPostExecute erhält ein Objekt (von doInBackground) und gibt nichts zurück


Dank, das reicht eigentlich schon. Jetzt weiß ich, dass doInBackground Objekte erwartet weswegen großgeschrieben wird die anderen zweite können nicht zurückgeben.
 
Zurück
Oben Unten