Библиотека okhttp, приложение вылетает в официальном примере

Рейтинг: 0Ответов: 1Опубликовано: 19.04.2015

Есть у okhttp библиотеки официальный пример

Пример

Когда дело доходит до этой строчки вылетает ошибка

Response response = client.newCall(request).execute();

Если этот участок кода я запускаю в AsyncTask, то все работает

PostExample example = new PostExample();
    String json = example.bowlingJson("Jesse", "Jake");
    String response = example.post("http://www.roundsapp.com/post", json);
    System.out.println(response);

Что происходит? response крошит приложение потому что запускается в UI потоке? Но разве библиотека не должна сама запускать этот процесс в другом потоке по умолчанию? Если не должна то как это сделать, у библиотеки okhttp есть встроенные решения?

Ответы

▲ 3Принят

Дело в том, что вызов Call#execute() запускает запрос в текущем потоке. Скорее всего, вы вызываете этот класс из главного потока. В Android при вызове методов связанных с сетевой активностью из главного потока вызывается исключение NetworkOnMainThreadException.

Что бы избежать этого, кроме AsyncTask, можно использовать метод enqueue.

Call call = client.newCall(request);
call.enqueue(new Callback() {
  @Override public void onResponse(Response response) throws IOException {
    System.out.println(response.body.string());

  }
  @Override public void onFailure(Request request, IOException e) {
  }
});

Этот метод запускает запрос на одном из приватных потоков, так что исключения не возникает. Однако, нужно быть внимательным, т.к. колбеки вызываются на этих же приватных потоках, то нельзя напрямую обращаться к UI методам Android. Если нужно сделать что-то простое, то предпочтительнее использовать AsyncTask.

UPDATE: Что-бы выполнить что-то на UI потоке, можно воспользоваться следущим универсальным приемом.

new Handler(Looper.getMainThread()).post(new Runnable() {
  @Override public void run() {
    // TODO:
  }
}

Но, как я уже говорил, желательнее использовать AsyncTask — этот механизм специально предназначен для упрощения таких вариантов использования.