Существует ли общепринятая практика выполнения асинхронных HTTP-запросов в Android? - PullRequest
40 голосов
/ 06 мая 2009

Я видел множество примеров, и все они, похоже, решают эту проблему по-разному. По сути, я просто хочу сделать самый простой способ сделать запрос, который не блокирует основной поток и может быть отменен.

Также не помогает, что у нас есть (по крайней мере) 2 библиотеки HTTP на выбор, java.net. * (Например, HttpURLConnection) и org.apache.http. *.

Есть ли консенсус в отношении того, что является лучшей практикой?

Ответы [ 4 ]

34 голосов
/ 13 мая 2009

В 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 запросов.

12 голосов
/ 07 ноября 2012

На самом деле в конструкции AsyncTasks есть несколько недостатков, которые не позволяют использовать его для работы в сети. Простой пример: вы потеряете связь между вашей AsyncTask и вашей деятельностью ... просто вращая ваше устройство.

Посмотрите на эту ветку : вы увидите, что AsyncTask также очень легко создает утечки памяти.

В документации AsyncTask об этом ясно сказано: AsyncTask следует использовать только для непродолжительных задач, и, как ни странно, сетевое взаимодействие не относится к этой категории.

Итак, я действительно предлагаю вам взглянуть на RoboSpice . Эта библиотека была разработана для асинхронных сетей, и это очень надежный способ ее реализации. Если у вас есть только несколько секунд, чтобы убедиться, посмотрите на эту inforgraphics .

RoboSpice также в качестве демонстрационного приложения в магазине: RoboSpice Motivations , который подробно расскажет все об асинхронной сети на Android.

1 голос
/ 27 мая 2013

Как насчет AsyncTask со ссылкой на статически сохраненный фрагмент (без пользовательского интерфейса), размещенный в Activity или другом фрагменте? Нет утечек памяти, элегантные асинхронные операции в отдельном потоке, нет потери ссылок на объекты.

Я думаю, что это будет нормально для http-запроса, но не для загрузки / выгрузки файлов. Если вы читаете внимательно, есть предложение:

Если вам необходимо поддерживать работу потоков в течение длительного времени, настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent, такие как Executor, ThreadPoolExecutor и FutureTask.

Но они не упоминают, что служба с отдельным потоком также может быть хорошим вариантом. Это предназначено для продолжения выполнения задач в фоновом режиме, независимо от того, что делает пользователь. (например, если он загружает какой-то файл, вы не хотите останавливать это, потому что он оставил действие)

Эта ссылка для образцов - найдите RetainedFragment.java

Это ссылка для AsyncTask.

0 голосов
/ 11 февраля 2016

Вы можете использовать Async Task для Android. Чтобы сделать запрос http, вы можете использовать класс HttpURLConnection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...