Использование фоновых потоков (AsyncTask)
До сих пор в рассматриваемых примерах для выполнения HTTP-запросов использовался главный поток активности. При определенной доле везения, ответы на все запросы будут получены оперативно, однако сетевое подключение и Интернет не всегда бывают столь быстрыми. Так как главный поток активности служит главным образом для обработки событий от пользователя (щелчков на кнопках и т.д.) и обновлений пользовательского интерфейса, для выполнения работы, требующей заметного времени, должен применяться фоновый поток. Android принуждает к такому подходу, поскольку если главный поток не обработает что-нибудь на протяжении 5 секунд, инициируется условие ANR (Application Not Responding — приложение не отвечает), которое нарушает привычную работу пользователя, отображая раздражающее диалоговое окно с запросом у пользователя подтверждения о завершении приложения (это также называется принудительным закрытием).
Детали, связанные с главным потоком и временным лимитом в 5 секунд, приведены в главе 17, но сейчас важно знать, что главный поток нельзя связывать на длительный период времени.
Если требуется только выполнить какие-то вычисления, не приводящие к обновлению пользовательского интерфейса, можно воспользоваться простым объектом Thread и освободить главный поток от некоторого объема работы. Однако такой подход не подходит, если нужно обновлять пользовательский интерфейс. И поскольку инструментальный набор для построения пользовательских интерфейсов Android не является безопасным в отношении потоков, такое обновление должно производиться только из главного потока.
Если в качестве результата фонового потока планируется какое-то обновление пользовательского интерфейса, необходимо всерьез подумать о применении класса AsyncTask. Этот класс предоставляет удобный способ для переноса в фоновый режим обработки, приводящей к обновлению пользовательского интерфейса. Класс AsyncTask самостоятельно заботится о создании фонового потока, где будет выполняться работа, а также о наборе обратных вызовов, которые будут запускаться в главном потоке для обеспечения простого доступа к элементам пользовательского интерфейса (т.е. представлениям). Обратные вызовы могут инициироваться до, в течение и после запуска фонового потока.
Рассмотрим для примера получение из сетевого сервера изображения, которое должно отображаться в приложении. Возможно, изображение будет создаваться на лету. Поскольку нельзя предсказать, сколько времени займет получение изображения, для решения этой задачи понадобится применять фоновый поток.
В е 15.9 приведена простая реализация AsyncTask, которая делает необходимую работу. Обсуждения этого кода, а также файла компоновки и Java-кода активности, вызывающей этот AsyncTask, вы найдете ниже.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.