Есть ли принятая передовая практика по созданию асинхронных HTTP-запросов в Android?
Я видел несколько примеров, и все они, похоже, решают эту проблему по-разному. В принципе, мне просто нужен самый простой способ сделать запрос, который не будет блокировать основной поток и будет отменен.
Это также не помогает, у нас есть (по крайней мере) 2 библиотеки HTTP на выбор, java.net. * (например, HttpURLConnection) и org.apache.http. *.
Существует ли какой-либо консенсус относительно наилучшей практики?
Ответы
Ответ 1
Android 1.5 SDK представила новый класс AsyncTask, предназначенный для выполнения запущенных задач в фоновом потоке и передачи результата в пользовательский интерфейс нить немного проще. Пример, приведенный в Блог разработчиков Android дает основную идею о том, как его использовать:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
Метод doInBackgroundThread
вызывается в отдельном потоке (управляется пулом потоков ExecutorService
), и результат сообщается методу onPostExecute
, который запускается в потоке пользовательского интерфейса. Вы можете вызвать cancel(boolean mayInterruptIfRunning)
в подкласс AsyncTask
, чтобы отменить выполняемую задачу.
Что касается использования библиотек java.net
или org.apache.http
для доступа к сети, это зависит от вас. Я обнаружил, что библиотеки java.net
очень приятны в использовании, когда просто пытаются выдать GET
и читать результат. Библиотеки org.apache.http
позволят вам выполнять почти все, что вам нужно, с помощью HTTP
, но они могут быть немного сложнее в использовании, и я нашел их не для выполнения (Android) для простых GET
запросов.
Ответ 2
На самом деле в дизайне AsyncTasks существует несколько недостатков, которые препятствуют тому, чтобы он был действительно полезным для работы в сети. Простым примером является то, что вы потеряете связь между вашей AsyncTask и вашей деятельностью... просто вращайте свое устройство.
Посмотрите этот поток: вы увидите, что AsyncTask также очень легко создает утечки памяти.
В документации AsyncTask ясно, что AsyncTask следует использовать только для коротких жизненных задач, и, как и следовало ожидать, сеть не относится к этой категории.
Итак, я действительно предлагаю вам взглянуть на RoboSpice. Эта библиотека была разработана для асинхронной сети, и это очень надежный способ ее реализации.
Если у вас есть только несколько секунд, чтобы убедиться, посмотрите на inforgraphics.
RoboSpice также является демонстрационным приложением в магазине: RoboSpice Motivations, в котором будут подробно описаны все асинхронные сети на Android.
Ответ 3
Как насчет AsyncTask
со ссылкой на статический сохраненный фрагмент (без интерфейса), размещенный в Activity или другом фрагменте? Отсутствие утечек памяти, элегантные операции async в отдельном потоке, отсутствие ссылок на объекты.
Я думаю, что это было бы нормально для HTTP-запроса, но не для загрузки/загрузки файлов. Если вы внимательно прочитаете, есть предложение:
Если вам нужно поддерживать длительность потоков в течение длительных периодов времени, настоятельно рекомендуется использовать различные API, предоставляемые java.util.concurrent pacakge, такие как Executor, ThreadPoolExecutor и FutureTask.
Но они не упоминают, что service с отдельным потоком может быть хорошим вариантом. Это предназначено для продолжения выполнения задач в фоновом режиме, независимо от того, что делает пользователь. (например, если он загружает файл, который вы не хотите останавливать, потому что он оставил действие)
Этот ссылка для образцов - найдите RetainedFragment.java
Эта ссылка для AsyncTask.
Ответ 4
Вы можете использовать Async Task для Android. Чтобы сделать запрос HTTP, вы можете использовать класс HttpURLConnection.