Retrofit 1.9.0からRetrofit 2.0.0-beta3に移行した記録

Retrofit 1.9.0 を使っていたコードをRetrofit 2.0.0-beta3に書き換えてみたら思いのほか変更が多くて大変でした。

全体的に、Retrofit自体がOkHttpのみに依存するようになったことで、OkHttpと重複する機能が削られるなどインターフェイス全域にわたる大きな変更が加えられました。またOkHttpも3.0となり、OkHttpClient, Request, Responseなどがimmutable classになっています。

修正パッチはこんな感じです:

migration to Retrofit2 / OkHttp3 by gfx · Pull Request #36 · gfx/Android-Helium · GitHub

このAndroidアプリのWeb API呼び出しは次のような特徴を備えています。

  • API endpointは3つ
    • うち2つはJSONを返し、1つはXMLを返す
  • Retrofit RxJava call adapterを使っている
  • テストではHTTP clientのmockを定義して使っている

今回修正することになった大きな部分は次のとおりです。

  • 名前の変更: RestAdapter から Retrofit
  • RetrofitのRequestInterceptorが削除され、OkHttpのInterceptorに統一された
  • RxJava call adapterが別モジュールになった。これが足りないと非常にわかりにくい実行時エラーになる
  • Gson converterなどのconverterもすべて別モジュールになった
  • setLogLevelがなくなり、com.squareup.okhttp3:logging-interceptor モジュールが必要になった
  • setter / getterが setFoo(x) / getFoo() ではなく foo(x) / foo() になった
  • ObservablesubscribeOn() が指定されないようになったので、呼び出し側で subscribeOn(Schedulers.io()) する必要がある