Возникновение условия ANR
Обратите внимание, что теперь можно установить тайм-аут в 60 секунд, не переживая о возникновении условия ANR. В коде видно, что информация о ходе работ обновляется в течение шагов настройки подключения HttpClient, выполнения HTTP-запроса, преобразования ответа в виде изображения в массив байтов и затем построения из него объекта Bitmap. Когда downloadImage() вернет управление doInBackground() и будет произведен возврат из doInBackground(), Android позаботится о получении возвращаемого значения и передаче его в onPostExecute(). После передачи объекта Bitmap в on- PostExecute() безопасно обновить ImageView с ним, т.к. onPostExecute() выполняется в главном потоке активности. Но что если во время загрузки возникнет какое-то исключение? Если вместо изображения из HTTP-запроса будет получено исключение, объект Bitmap будет равен null. Этот факт можно определить в onPostExecute () и отобразить сообщение об ошибке, не устанавливая ImageView в Bitmap. Разумеется, в случае сбоя загрузки можно предпринять и другое действие.
Имейте в виду, что в главном потоке не должен выполняться только код из метода doInBackground(). Поэтому не делайте в этом методе ничего такого, что бы затрагивало пользовательский интерфейс, иначе возникнет проблема. Например, не вызывайте в doInBackground() методы, которые модифицируют элементы пользовательского интерфейса. Взаимодействуйте с такими элементами только в методах onPreExecute(), onProgressUpdate() и onPostExecute().
Давайте дополним последний пример XML-файлом компоновки ( 15.10) и Java-кодом для активности ( 15.11).
Компоновка предельно проста. Имеется одна кнопка и рядом с ней текстовое сообщение. Этот текст будет отражать информацию о ходе работ. Ниже есть пространство для сообщения об ошибке, текст которого отображается красным цветом. И, наконец, предусмотрено место для вывода изображения.
Внутри метода обратного вызова кнопки doClick() необходимо создать новый экземпляр настроенного класса AsyncTask и вызвать его метод execute(). Именно такой шаблон будет использоваться. Создайте экземпляр расширения AsyncTask и вызовите его метод execute(). В рассматриваемом примере производится обращение к службе диаграмм Google (Google Chart API), которая получает данные и метки и создает изображение диаграммы, возвращая его в формате PNG. Однако перед запуском задачи понадобится проверить, не выполняется ли она уже. Если пользователь дважды щелкнет на кнопке, в результате окажется две фоновых задачи. К счастью, класс AsyncTask позволяет проверять свое состояние. Если doTask не равно null, есть вероятность наличия работающей задачи. Это значит, что нужно проверить состояние AsyncTask. Если оно отлично от FINISHED (завершена), задача находится в состоянии либо RUNNING (выполняется), либо PENDING (ожидает) и готова выполняться. Таким образом, создавать новый экземпляр AsyncTask необходимо, только если существует задача и она уже FINISHED. Если предыдущий экземпляр AsyncTask смог успешно загрузить изображение, возможно, не имеет смысла загружать его заново. Однако в рассматриваемом примере мы получаем изображение снова.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.