Retrofit - android.os.NetworkOnMainThreadException
Je suis en utilisant la Rénovation 2 pour obtenir json et de l'analyser pour POJO. Mon but est d'obtenir une valeur de cet objet.
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
Mon REPOS client:
public interface MyClient {
@GET("/part1/part2")
Call<MyItem> getMyItem(@Query("param1") String param1,
@Query("param2") String param2,
@Query("param3") String param3);
}
Ici J'ai trouvé un grand grand outil de création de service:
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);
}
}
Alors je suis la création de nouveaux services utilisant le Service de générateur de classe:
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();
}
Lorsque j'essaie d'exécuter ce code, j'obtiens cette erreur:
android.os.NetworkOnMainThreadException
au android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
à java.net.InetAddress.lookupHostByName(InetAddress.java:418)
à java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
à java.net.InetAddress.getAllByName(InetAddress.java:215)
au okhttp3.Dns$1.recherche Dns.java:39)
au okhttp3.interne.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:173)
au okhttp3.interne.http.RouteSelector.nextProxy(RouteSelector.java:139)
au okhttp3.interne.http.RouteSelector.prochaine(RouteSelector.java:81)
au okhttp3.interne.http.StreamAllocation.findConnection(StreamAllocation.java:174)
au okhttp3.interne.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:127)
au okhttp3.interne.http.StreamAllocation.newStream(StreamAllocation.java:97)
au okhttp3.interne.http.HttpEngine.connect(HttpEngine.java:289)
au okhttp3.interne.http.HttpEngine.sendRequest(HttpEngine.java:241)
au okhttp3.RealCall.getResponse(RealCall.java:240)
au okhttp3.RealCall$ApplicationInterceptorChain.procéder(RealCall.java:198)
au okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160)
au okhttp3.RealCall.execute(RealCall.java:57)
au retrofit2.OkHttpCall.execute(OkHttpCall.java:177)
au retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:87)
à l'uz.cp.ox.les données.MyRepository.getMyItem(MyRepository.java:31)
à l'uz.cp.ox.les présentateurs.MyPresenter.n'(MyPresenter.java:30)
à l'uz.cp.ox.les activités.MyActivity.onClick(MyActivity.java:52)
au android.vue.Vue.performClick(point de Vue.java:4756)
au android.vue.Afficher$PerformClick.exécuter(point de Vue.java:19749)
au android.os.Gestionnaire d'.handleCallback(Handler.java:739)
au android.os.Gestionnaire d'.dispatchMessage(Handler.java:95)
au android.os.Looper.boucle(Looper.java:135)
au android.app.ActivityThread.principale(ActivityThread.java:5221)
à java.lang.de réfléchir.La méthode.invoke(Native method)
à java.lang.de réfléchir.La méthode.invoke(la Méthode.java:372)
au com.android.interne.os.ZygoteInit$MethodAndArgsCaller.exécuter(ZygoteInit.java:899)
au com.android.interne.os.ZygoteInit.principale(ZygoteInit.java:694)
J'ai pensé que la Rénovation automatiquement fait le travail dans le thread d'arrière-plan. Ou j'ai mal compris quelque chose. Ce qui est mauvais dans cette situation et comment le résoudre?
source d'informationauteur Joe Richard
Vous devez vous connecter pour publier un commentaire.
Qu'il ne si vous utilisez la version asynchrone -
enqueue
. Vous utilisez la version synchrone, qui fonctionne sur le thread appelant.L'appeler de cette façon, au lieu de:
Dans onResponse(), utilisez
response.body()
pour obtenir votre réponse, telles que:MyItem myItem=response.body();
Edit: Fixe onResponse() & onFailure() les signatures et ajout de l'exemple de onRespnose().
Vous appelez webservice sur le thread principal, c'est pourquoi u eu cette erreur 'android.os.NetworkOnMainThreadException'.
Vous pouvez utiliser le codage ci-dessus répondu par NightSkyDev pour obtenir les données que tu veux.
Dans la Rénovation de Deux Types de Méthode d'exécution-
Mettre en file d'attente - Travaux sur le thread d'arrière-plan automatiquement poignée en rénovation.
Exécuter - Travaux sur le thread de l'INTERFACE utilisateur manuellement nécessaires pour les mettre dans les deux thread d'arrière-plan ou prendre l'aide de async task.