Подтвердить что ты не робот

Есть ли принятая передовая практика по созданию асинхронных HTTP-запросов в Android?

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

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

Существует ли какой-либо консенсус относительно наилучшей практики?

4b9b3361

Ответ 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.