Модификация - android.os.NetworkOnMainThreadException
Я использую Retrofit 2, чтобы получить JSON и разобрать его в POJO. Моя цель - получить одно значение этого объекта.
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
Мой клиент REST:
public interface MyClient {
@GET("/part1/part2")
Call<MyItem> getMyItem(@Query("param1") String param1,
@Query("param2") String param2,
@Query("param3") String param3);
}
Вот Я нашел отличный инструмент для создания сервиса:
public class ServiceGenerator {
public static final String API_BASE_URL = "http://my.api.com";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static <S> S createService(Class<S> serviceClass) {
Retrofit retrofit = builder.client(httpClient.build()).build();
return retrofit.create(serviceClass);
}
}
Затем я создаю новый сервис, используя класс генератора услуг:
MyClient api = ServiceGenerator.createService(MyClient.class);
Call<MyItem> call = api.getMyItem(param1, param2, param3);
MyItem myItem= null;
try {
myItem= call.execute().body();
Log.d("MyTag", myItem.getValue());
} catch (IOException e) {
e.printStackTrace();
}
Когда я пытаюсь запустить этот код, я получаю эту ошибку:
android.os.NetworkOnMainThreadException в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1147) в java.net.InetAddress.lookupHostByName (InetAddress.java:418) в java.net.InetAddress.All 252) по адресу java.net.InetAddress.getAllByName (InetAddress.java:215) по адресу: okhttp3.Dns $ 1.lookup (Dns.java:39) по адресу okhttp3.internal.http.RouteSelector.resetNextInetSocketAddress (RouteStt3o) atava .internal.http.RouteSelector.nextProxy (RouteSelector.java:139) в okhttp3.internal.http.RouteSelector.next (RouteSelector.java:81) в okhttp3.internal.http.StreamAllocation.findConnection (StreamAllocation). okhttp3.internal.http.StreamAllocation.findHealthyConnection (StreamAllocation.java:127) в okhttp3.internal.http.StreamAllocation.newStream (StreamAllocation.java:97) в okhttp3.internal.http.HttpEngine.jpg: 09: 09 в okhttp3.internal.http.HttpEngine.sendRequest (HttpEngine.java:241) в okhttp3.RealCall.getResponse (RealCall 0 с Presenters.MyPresenter.do (MyPresenter.java:30) на uz.cp.ox.activities.MyActivity.onClick (MyActivity.java:52) на android.view.View.performClick (View.java:4756) на android.view .View $ PerformClick.run (View.java:19749) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper. цикл (Looper.java:135) в android.app.ActivityThread.main (ActivityThread.java:5221) в java.lang.reflect.Method.invoke (собственный метод) в java.lang.reflect.Method.invoke (метод. Java: 372) на com.android.internal.os.ZygoteIn it $ MethodAndArgsCaller.run (ZygoteInit.java:899) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)
Я думал, что Retrofit автоматически делает работу в фоновом потоке. Или я что-то не так понял. Что не так в этой ситуации и как ее решить?