Catch Ausnahme von AsyncTask. Brauchen Sie zu denken

8

Ich möchte die Ausnahme eines Threads in doInBackground abfangen und die Fehlermeldung in onPostExcecute ausgeben. Das Problem ist, dass ich das Throwable-Objekt in onPostExecute nicht habe. Wie kann Ausnahme im Nicht-UI-Thread abgefangen werden und die Fehlermeldung im UI-Thread ausgegeben wird?

%Vor%

Aktualisierung nach Aruns Antwort:

Dies ist meine Wrapper-Klasse "AsyncTask". Es beabsichtigt, Exception in doInBackground zu behandeln, aber ich kann keine gute Lösung dafür finden.

%Vor%     
Emerald214 08.06.2012, 07:06
quelle

3 Antworten

7

Ändern Sie den Rückgabetyp von doInBackground() in Object und wenn Sie das Ergebnis in onPostExecute(Object result) erhalten, verwenden Sie den Operator instanceOf , um zu überprüfen, ob das zurückgegebene Ergebnis Exception oder List<String> ist.

Bearbeiten

Da das Ergebnis entweder eine Ausnahme oder eine andere Liste sein kann, können Sie Folgendes verwenden:

%Vor%

Ändern Sie auch die folgende Aussage:

%Vor%     
Arun George 08.06.2012, 07:18
quelle
4

Speichern Sie die Exception einfach in einer Liste und behandeln Sie sie später, da onPostExecute () immer nach doInBackground () aufgerufen wird:

%Vor%

Dies ist machbar, wird aber selten benutzt, da wir in den meisten Fällen die Ausnahme behandeln wollen, sobald sie geworfen und eingefangen wird:

%Vor%

Hoffe, das macht Sinn.

    
yorkw 08.06.2012 11:04
quelle
4

Ändern des Rückgabetyps von doInBackground in Object , um möglicherweise einen Exception zu übergeben und dann instanceof() zu verwenden, ist eine Quelle von Code-Geruch (schlechte Programmierpraxis). Es ist immer vorzuziehen, den Rückgabetyp auf die spezifische Sache zu beschränken, die zurückgegeben werden soll.

Basierend auf dieser Antwort fügen Sie einfach ein privates Mitglied hinzu, um die in doInBackground geworfene Ausnahme zu speichern, und prüfen Sie danach erste Sache in onPostExecute .

Nur ein Exception muss abgefangen werden, da Sie die Aktionen in doInBackground unmittelbar nach dem Auslösen der Ausnahme anhalten und in onPostExecute , wo Sie Zugriff auf die UI-Elemente haben, ordnungsgemäß behandeln und den Benutzer darüber informieren können das Missgeschick.

Generisches Beispiel (Hauptteil der AsyncTask):

%Vor%     
Abid H. Mujtaba 04.11.2013 20:36
quelle

Tags und Links