java - example - retrofit documentation android
Retrofit-android.os.NetworkOnMainThreadException (3)
Estoy usando Retrofit 2 para obtener json y analizarlo a POJO. Mi propósito es obtener un valor de ese objeto.
compile ''com.squareup.retrofit2:retrofit:2.0.0-beta4''
compile ''com.squareup.retrofit2:converter-gson:2.0.0-beta4''
Mi cliente REST:
public interface MyClient {
@GET("/part1/part2")
Call<MyItem> getMyItem(@Query("param1") String param1,
@Query("param2") String param2,
@Query("param3") String param3);
}
Here encontré una gran gran herramienta para crear servicio:
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);
}
}
Entonces estoy creando un nuevo servicio usando la clase de generador de servicio:
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();
}
Cuando intento ejecutar este código, aparece este error:
android.os.NetworkOnMainThreadException en android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1147) en java.net.InetAddressetAdcepcion.pelicidad.Pelicidad.Payunidad.Payunidad. 252) en java.net.InetAddress.getAllByName (InetAddress.java:215) en okhttp3.Dns $ 1.lookup (Dns.java:39) en okhttp3.internal.http.RouteSelector.resetNextInetSocketAddress (RouteSelector.java). .internal.http.RouteSelector.nextProxy (RouteSelector.java:139) en okhttp3.internal.http.RouteSelector.next (RouteSelector.java:81) en okcttp3.internal.http.StreamAllocation. okhttp3.internal.http.StreamAllocation.findHealthyConnection (StreamAllocation.java:127) en okhttp3.internal.http.StreamAllocation.newStream (Vocabulario) .p.png.png.png.png.html. en okhttp3.internal.http.HttpEngine.sendRequest (HttpEngine.java:241) en okhttp3.RealCall.getResponse (RealCall .java: 240) en okhttp3.RealCall $ ApplicationInterceptorChain.proceed (RealCall.java:198) en okhttp3.RealCall.getResponseWithInterceptorChain (. .execute (OkHttpCall.java:177) en retrofit2.ExecutorCallAdapterFactory $ ExecutorCallbackCall.execute (ExecutorCallAdapterFactory.java:87) en uz.cp.ox.data.MyRepository.getMyItem (MyRepository.pc. presenters.MyPresenter.do (MyPresenter.java:30) en uz.cp.ox.activities.MyActivity.onClick (MyActivity.java:52) en android.view.View.performClick (View.java:4756) en android.view .View $ PerformClick.run (View.java:19749) en android.os.Handler.handleCallback (Handler.java:739) en android.os.Handler.dispatchMessage (Handler.java:95) en android.os.Looper. loop (Looper.java:135) en android.app.ActivityThread.main (ActivityThread.java:5221) en java.lang.reflect.Method.invoke (Método nativo) en java.lang.reflect.Method.invoke (Método. java: 372) en com.android.internal.os.ZygoteIn it $ MethodAndArgsCaller.run (ZygoteInit.java:899) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)
Pensé que Retrofit automáticamente hace el trabajo en el hilo de fondo. O entendí mal algo ¿Qué está mal en esta situación y cómo resolverlo?
Pensé que Retrofit automáticamente hace el trabajo en el hilo de fondo.
Lo hace si utiliza la versión asíncrona - en enqueue
. Estás utilizando la versión síncrona, que se ejecuta en el subproceso de llamada.
Llámalo así en su lugar:
MyClient api = ServiceGenerator.createService(MyClient.class);
Call<MyItem> call = api.getMyItem(param1, param2, param3);
call.enqueue(new Callback<MyItem>() {
@Override
public void onResponse(Call<MyItem> call, Response<MyItem> response) {
MyItem myItem=response.body();
}
@Override
public void onFailure(Call<MyItem> call, Throwable t) {
//Handle failure
}
});
En onResponse (), use response.body()
para obtener su respuesta, como por ejemplo:
MyItem myItem=response.body();
Edición: Se corrigieron las firmas onResponse () y onFailure () y se agregó un ejemplo a onRespnose ().
En la versión posterior de Dos tipos de métodos de ejecución de métodos: Encolar : los trabajos en el subproceso en segundo plano se manejan automáticamente mediante la modificación. Ejecutar : funciona en el subproceso de la IU requerido manualmente para colocar en el subproceso de fondo o tomar ayuda de una tarea asíncrona.
Está llamando al servicio web en el hilo principal, es por eso que recibió este error '' android.os.NetworkOnMainThreadException ''.
Puede usar la codificación anterior respondida por para obtener los datos que desea.