2014-12-07 3 views
26

OKHttp поддерживает как synchronous and asynchronous api. Если я хочу, чтобы выдать запрос асинхронного, я могу:Используя OKHttp, в чем разница между синхронным запросом в AsyncTask и OKhttp Asynchronous request?

  1. Используйте AsyncTask и выдавать OKhttp синхронного API.
  2. Выполните асинхронную аффинность OKhttp.

В чем разница между этими двумя вариантами? И какой из них лучше?

ответ

55

Довольно много отличается!

Использование AsyncTask для HTTP-запросов в значительной степени является одной из худших вещей, которые вы можете сделать на Android. Это чревато проблемами и ошибками, которые наилучшим образом безоговорочно избегают. Например, вы не можете отменить запрос во время выполнения. Модели использования AsyncTask также обычно утечка ссылки на Activity, кардинальный грех развития Android. асинхронной

OkHttp является значительно превосходит по многим причинам:

  • Он поддерживает родную отмену. Если запрос находится в полете, ссылка на Callback освобождается и никогда не будет вызвана. Кроме того, если запрос еще не запущен, он никогда не будет выполнен. Если вы используете HTTP/2 или SPDY, мы можем фактически отказаться от экономии полосы пропускания и мощности.
  • Он поддерживает тегирование нескольких запросов и отмену их всего одним вызовом метода. Это означает, что каждый запрос, который вы делаете, скажем, Activity, может быть помечен экземпляром Activity. Затем в или onStop вы можете отменить все запросы, отмеченные экземпляром Activity.
  • Если вы используете HTTP/2 или SPDY-запросы, а ответы мультиплексируются по одному соединению с удаленным сервером и с помощью асинхронного механизма Call это намного эффективнее, чем блокирующая версия.

Так что если вы можете, используйте Call.enqueue!

1

Ничего особенного. OKHttp async - это API-интерфейс OKHttp. Поэтому, пока вы объединяете банки для всех платформ, вы должны быть хорошими. AsyncTask - это способ Android.

Однако, поскольку задача Honeycomb Async выполняет задачи последовательно, а не параллельно. Это означает, что, хотя метод execute AsyncTask охватывает новый поток, который откладывает вашу работу от потока пользовательского интерфейса, но все задачи, отправленные в один сеанс AsyncTask, выполняются в одном и том же потоке.

Итак, для 3 заданных задач u не получают 3 потока, они все работают последовательно на одном натянутом потоке. С помощью OKHttp вы можете достичь истинного параллелизма с помощью обратных вызовов и асинхронных GET и POST.

Хотя вы также можете выполнять истинный параллелизм в методах AsyncTask (проверьте перегруженные методы выполнения в AsyncTask), но поведение по умолчанию Android не должно этого делать.

Смежные вопросы