Выбросьте исключение в doInBackground и поймайте inPostExecute

У меня есть ошибка, которую нужно удалить из doInBackground метода моей Asynctask . Является ли это возможным? Как я могу сделать так, чтобы исключение было поймано onPostExecute ?

Вы не можете генерировать исключения по потокам.

Однако вы можете поймать исключение в doInBackground() , сохранить его где-нибудь, например, переменную-член в asynctask, а затем обработать ее в onPostExecute() .

Нет, вы не можете генерировать исключение в фоновом потоке.

Гораздо лучший способ – передать результат, возвращенный из фонового потока ( если его сообщение об исключении, пусть оно будет ), к onPostExecute() который затем должен обрабатывать результат в соответствии с потребностью.

Вы можете выполнить это одним из следующих трех способов:

  1. Храните исключение в качестве локальной переменной подкласса AsyncTask и проверяйте его в onPostExecute() , как это предложено laalto и Peter Pei Guo . Вы можете запросить его тип класса и выполнить различные задачи в зависимости от типа исключения. AsyncTask гарантирует, что это будет поточно-безопасным.

  2. Измените общий тип результата на Object и верните либо исключение, либо результат из doInBackground() , затем проверьте тип класса объекта результата в onPostExecute() и произведите его и поработайте над ним, если это необходимо. Это главным образом то, как FutureTask (который использует AsyncTask внутри) реализует метод get() , хотя он сохраняет его состояние в локальной переменной, так как не может полагаться на тип результата.

  3. Создайте класс держателя для вашего результата, который может быть сконструирован так, чтобы содержать либо результат, либо некоторые определенные исключения, определить, что метод get возвращает тип результата, если он доступен, и исключить исключение в противном случае, а затем установить общий тип результата подкласса AsyncTask для этого класса, И улавливать исключения в onPostExecute() при получении результата от держателя.