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% Ä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%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.
Ä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%Tags und Links android exception-handling