Help us understand the problem. What is going on with this article?

RxJava2CallAdapterFactoryをaddしたRetrofit Clientで返り値Call型が指定されたAPI定義を実行するとどうなるか?

こんな感じでRetorfit Clientを作成しているコードがあるとする。

val retrofitClient = Retrofit.Builder()
    .baseUrl(url)
    .client(okHttpClient)
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build()

addCallAdapterFactoryRxJava2CallAdapterを追加しているため、このクラインとでは次のようなObservable型を返すようなAPI定義を実行した際にレスポンスをObservableとして扱える。

 interface SmapleAPI {
     @GET("foo/bar")
     fun getSampleResponse(): Observable<Hoge>
 }

この時、次のCall型を返すようにAPI定義しRxJava2CallAdapterを追加したクライアントでAPIリクエストするとどうなるか?

 interface SmapleAPI {
     @GET("foo/bar")
     fun getSampleResponse(): Call<Hoge>
 }

この場合、APIリクエストするとCall型としてレスポンスを受け取れます。

RetrofitがCallAdapterをレスポンスに適用する流れ

addCallAdapterFactoryで渡されたクラス(CallAdapter.Factoryを継承したクラス)はRetrofitクラスのList<CallAdapter.Factory> callAdapterFactories変数に追加される。(callAdapterFactoriesにはデフォルトでDefaultCallAdapterFactoryが追加されている。)

そして、RetrofitクラスのnextCallAdapterメソッドでCallAdapter.FactoryからCallAdapterを得てそれがレスポンスに適用される。(HttpServiceMethodクラスのadaptとそれをoverrideした各クラスを参照)

この処理は次のnextCallAdapterコードで行っている。

int start = callAdapterFactories.indexOf(skipPast) + 1;
for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
    CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
    if (adapter != null) {
        return adapter;
    }
}

ここで、CallAdapter.Factoryのgetメソッドの戻り値がnullとなる場合、nextCallAdapterメソッドはadapterを返さないのでレスポンスに適用されない。

そして、RxJava2CallAdapterFactoryのgetメソッドでは次のような判定を行い、rawTypeObservableFlowableSingleMaybe型でなければnullを返している。

そのため、nextCallAdapterメソッドでもRxJavaCallAddapterを返さず、レスポンスにRxJavaCallAddapterが適用されることは無い。

boolean isFlowable = rawType == Flowable.class;
boolean isSingle = rawType == Single.class;
boolean isMaybe = rawType == Maybe.class;
if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) {
    return null;
}
zozotech
70億人のファッションを技術の力で変えていく
https://tech.zozo.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした