Как обрабатывать ошибки в пользовательском AsyncTaskLoader?

Я расширяю AsyncTaskLoader, который я использую позже в Fragment через LoaderManager. Предлагается ли способ обработки ошибок, возникающих во время асинхронной задачи? Я хотел бы всплывающее сообщение с просьбой отменить или повторить попытку при возникновении ошибки подключения к Интернету.

Единственный способ, о котором я могу думать сейчас, - заставить Loader возвращать значение null при ошибке или обернуть загруженный объект в другой, который будет иметь код состояния.

Ответ 1

Что мы сделали в нашем последнем проекте: создаем обертка, которая содержит общий и экскремент вроде этого:

public class AsyncTaskResult<T> {
   private final T result;
   private final Exception error;
   //getter & setter
}

Поймайте все Исключения в doInBackground(...) и упакуйте их в оболочку результата (или результат, если нет ошибки). В своем пользовательском интерфейсе проверьте оболочку, если она является исключением, затем покажите соответствующее сообщение об ошибке, иначе заполните поля результатом.

Для нас также было хорошей практикой определить, какие уникальные типы исключений существуют (например, исключение с восстанавливаемой ошибкой, когда вы показываете только диалог или сбой приложения, когда вам нужно выгнать пользователя в главное меню) и только бросайте эти виды (при улавливании специфических в своей асинтете), поэтому вам не нужно беспокоиться о сотнях различных исключений, а также абстрагировать обработку ошибок. Вы также можете предоставить строковые ключи с правильным сообщением об ошибке I18n, поэтому вам нужно написать e.getMessage()

Ответ 2

Я видел хорошие результаты при возврате составного объекта, который содержит полезную нагрузку (если есть), и код состояния, как вы предложили. Тогда Fragment, на котором размещается AsyncTaskLoader, может отображаться соответствующая и информативная ошибка. Этот подход имеет дополнительное преимущество в том, что он использует встроенный жизненный цикл загрузчика.

Другой вариант - зарегистрировать прослушиватель, который ваш AsyncTaskLoader будет уведомлять при возникновении ошибок. Facebook SDK содержит пример использования прослушивателей ошибок с загрузчиками.