web-dev-qa-db-fra.com

Retrofit effectue-t-il des appels réseau sur le thread principal?

J'essaie d'explorer Retrofit + OkHttp sur Android. Voici un code que j'ai trouvé en ligne:

RestAdapter restAdapter = new RestAdapter.Builder().setExecutors(executor, executor)
.setClient(new OkClient(okHttpClient))
.setServer("blah").toString())
.build();

Si je n'utilise pas le service exécuteur, mon code s'exécutera-t-il sur le thread principal? Dois-je donc faire des requêtes Web dans un nouveau fil?

31
Jaguar

La méthode qui renvoie une valeur le fait de manière synchrone.

@GET("/user/{id}/asset")
Asset getUserAsset(@Path("id") int id);

Pour le faire Asynchrone, il vous suffit d'ajouter un rappel.

@GET("/user/{id}/asset")
void getUserAsset(@Path("id") int id, Callback<Asset> cb);

J'espère que cela t'aides.

Cordialement!

17
Martin Cazares

Les méthodes de modification peuvent être déclarées pour une exécution synchrone ou asynchrone.

Une méthode avec un type de retour sera exécutée de manière synchrone.

@GET("/user/{id}/photo")
Photo getUserPhoto(@Path("id") int id);

L'exécution asynchrone requiert que le dernier paramètre de la méthode soit un Callback.

@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);

Sur Android, les rappels seront exécutés sur le thread principal. Pour les applications de bureau, les rappels auront lieu sur le même thread qui a exécuté la requête HTTP.

Retrofit intègre également RxJava pour prendre en charge les méthodes avec un type de retour de rx.Observable

@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);

Les requêtes observables sont abonnées de manière asynchrone et observées sur le même thread qui a exécuté la requête HTTP. Pour observer sur un autre thread (par exemple, le thread principal d'Android), appelez observeOn(Scheduler) sur le Observable retourné.

Remarque: L'intégration RxJava est expérimentale.

116
Jake Wharton