Intereting Posts

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

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

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

Solutions Collecting From Web of "Как обрабатывать ошибки в пользовательском AsyncTaskLoader?"

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

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

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

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

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

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