Решение проблем, связанных с многопоточностью
В примерах, рассмотренных до сих пор, новый экземпляр HttpClient создавался для каждого запроса. Однако на практике, возможно, понадобится создать один экземпляр HttpClient для всего приложения и использовать его во всех HTTP-коммуникациях. При единственном экземпляре HttpClient, обслуживающем все HTTP-запросы, понадобится также уделять внимание проблемам многопоточности, которые могут возникать в случае, когда через один и тот же экземпляр HttpClient выдается множество запросов. К счастью, HttpClient предоставляет средства, упрощающие решение задачи; все, что нужно сделать — это создать экземпляр DefaultHttpClient с использованием ThreadSafeClientConnManager, как показано в е 15.6.
Если приложение нуждается в выдаче множества HTTP-запросов, потребуется создать объект HttpClient, который обслужит все эти запросы. Простейший способ сделать это состоит в создании одиночного класса (Singleton), доступ к которому можно получить из любого места в приложении, как было показано здесь. Это стандартный шаблон проектирования Java, предусматривающий синхронизацию доступа к методу чтения, который возвращает один и только один объект HttpClient, создавая его при первом обращении.
Теперь взглянем на метод getHttpClient () класса CustomHttpClient. Этот метод отвечает за создание одиночного экземпляра HttpClient. Здесь устанавливаются некоторые базовые параметры, ряд значений, касающихся тайм-аута, и схемы, которые HttpClient будет поддерживать (т.е. HTTP and HTTPS). Обратите внимание, что при создании экземпляра DefaultHttpClient конструктору передается ClientConnectionManager. Экземпляр ClientConnectionManager отвечает за управление HTTP-соединениями для HttpClient. Поскольку требуется использовать один экземпляр HttpClient для всех HTTP-запросов (запросов, которые могут перекрываться в случае применения потоков), создается ThreadSafeClientConnManager.
Мы также продемонстрируем простейший способ получения ответа из HTTP-запроса с применением BasicResponseHandler. Код активности, в которой используется CustomHttpClient, показан в е 15.7.
В этом примере приложения выполняется простой HTTP-запрос GET к домашней странице Google. С использованием объекта BasicResponseHandler страница визуализируется в виде большой строки String, которая затем записывается в LogCat. Как видите, добавить BasicResponseHandler в метод execute() очень просто.
Может возникнуть соблазн извлечь выгоду от того факта, что каждое Android- приложение имеет ассоциированный с ним объект Application.
По умолчанию, если не определяется специальный объект приложения, Android использует android.app.Application. С объектом приложения связан интересный момент: в приложении всегда будет существовать в точности один объект приложения, и все компоненты могут получать доступ к нему (с использованием глобального объекта контекста). Вполне возможно расширить класс Application и добавить к нему функциональность, подобную CustomHttpClient. Однако в рассматриваемом примере не имеет смысла делать это внутри класса Application: если можно просто создать отдельный одиночный класс для решения потребности подобного рода, то намного лучше вообще не касаться Application.
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.