Лучший способ отправки HTTP GET запросов синхронно в Android?

В приложении для Android мне нужно сделать несколько запросов GET для URL-адреса, чтобы передавать данные на внешний сервер (как работает сторонний API).

Данные поступают спорадически. Я храню эти данные в очереди и хочу отправить их на сервер в фоновом режиме асинхронно, не замедляя основной поток пользовательского интерфейса. Каждая единица данных в очереди требует запроса GET. Очередь должна быть опустошена, даже если приложение закрывается.

Какая наилучшая практика? Пожалуйста, отправляйте/направляйте меня в код/​​учебники.

Ответ 1

Какая наилучшая практика для этого?

Это будет зависеть от того, что "this" и где эта работа выполняется.

Если "this" является "асинхронной работой", вы будете использовать потоки в одной форме или модуле:

  • Если ваши HTTP-операции управляют пользовательским интерфейсом, вы можете использовать AsyncTask, чтобы вы могли безопасно обновлять интерфейс с onPostExecute()

  • Если ваши операции HTTP выполняются исключительно в фоновом режиме, и вы хотите сделать это за один раз, используйте IntentService, у которого есть собственный фоновый поток и рабочая очередь

  • Если ваши операции HTTP выполняются исключительно в фоновом режиме, и вы хотите сделать это вовремя, и вы обеспокоены тем, что устройство должно оставаться без сна, пока все это происходит, рассмотрите мой WakefulIntentService

  • Если ваши операции HTTP выполняются исключительно в фоновом режиме, но вы чувствуете, что хотите сделать несколько за раз, переместите свой собственный Service, который использует Executor с вашим собственным пулом потоков, убедившись, что вы завершаете эту службу, когда работа выполняется (как это делает IntentService), и убедитесь, что устройство бодрствует с помощью WakeLock (и, возможно, WifiLock)

  • Etc.

Если "this" - это запросы HTTP GET, используйте:

  • HttpUrlConnection, или

  • HttpClient, или

  • OkHttp (обертка вокруг тех, у кого есть дополнительные преимущества) или

  • Retrofit (если ваши запросы GET действительно являются вызовами веб-службы) или

  • Volley (если вам нравится, что ваш код оболочки HTTP недокументирован, неподдерживается, но Googly)

  • Любое количество других сторонних библиотек-оболочек

Если "this" является "queue", используйте класс Queue или LinkedBlockingQueue, если вы планируете сразу работать с несколькими потоками.

Если "this" - это что-то еще, я не могу вам помочь, поскольку устал угадывать.

Ответ 2

Вы можете использовать свои собственные вызовы GET для асинхронного HTTP, используя AsyncTask, но я бы рекомендовал против него, если вы не делаете это из обучения точка зрения. Если вы хотите красивое, чистое и стабильное решение, я бы посоветовал вам использовать известную Android Asynchronous Http Client стороннюю библиотеку. На сайте:

"Асинхронный клиент Http-клиент на основе обратного вызова для Android, созданный поверх библиотек Apache HttpClient. Все запросы выполняются за пределами основного потока пользовательских интерфейсов приложений, но любая логика обратного вызова будет выполнена в том же потоке, что и обратный вызов, с использованием Передача сообщения обработчика андроидов.

Создание GET так же просто, как:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});