web-dev-qa-db-ja.com

Retrofitはメインスレッドでネットワーク呼び出しを行いますか?

私はAndroidでRetrofit + OkHttpを調べようとしています。オンラインで見つけたコードは次のとおりです。

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

Executorサービスを使用しない場合、コードはメインスレッドで実行されますか?したがって、新しいスレッドでWeb要求を行う必要がありますか?

31
Jaguar

値を返すメソッドはそれを同期的に行います。

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

非同期を行うには、コールバックを追加するだけです。

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

お役に立てれば。

よろしく!

17
Martin Cazares

レトロフィットメソッドは、同期実行または非同期実行のいずれかで宣言できます。

戻り値の型を持つメソッドは同期的に実行されます。

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

非同期実行では、メソッドの最後のパラメーターがCallbackである必要があります。

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

Androidでは、コールバックはメインスレッドで実行されます。デスクトップアプリケーションの場合、コールバックはHTTPリクエストを実行したのと同じスレッドで発生します。

また、RetrofitはRxJavaを統合して、戻り値の型が_rx.Observable_のメソッドをサポートします

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

監視可能な要求は非同期にサブスクライブされ、HTTP要求を実行した同じスレッドで監視されます。別のスレッド(Androidのメインスレッドなど)で監視するには、返されたObservableobserveOn(Scheduler)を呼び出します。

注:RxJava統合は実験的です。

116
Jake Wharton