Java
Android

最近リリースされたOkHttp3について

More than 3 years have passed since last update.

たまたまChangeLogを読んだので、気になったポイントを紹介します。


Package名を変更した

3系になってcom.squareup.okhttpからokhttp3に変更されています。理由はJakeのブログに詳しく書かれていますが、要約すると、2系のコードと共存出来るようにすることで、部分的/段階的に3系のコードを取り入れることを可能にして、バージョンアップの負担を減らすことが目的のようです。


グローバルなconnection poolの仕組みがなくなった

2系は全てのOkHttpClientのインスタンスがグローバルなコネクションプールを共有していたらしいのですが(知らなかった... :fearful:)、それがなくなりました。 そのため、3系では一つのOkHttpClientインスタンスをアプリケーション全体で使いまわすことが薦められています。


OkHttpClientが不変になった

2系のOkHttpClientはgetter/setterがあったため、途中で設定の変更が可能でした。このため内部ではリクエストを行う度にOkHttpClientのスナップショット(クローン)を生成していましたが、3系ではビルダーによって設定を記述し、不変なインスタンスを生成する方針に変更されました。(厳密にはコネクションプールやキャッシュなど不変でないものも含まれます)


OkHttpClientがCall.Factory interfaceを継承するようになった

これによりテストが容易になるそうです。


java.net.CookieHandlerの利用をやめた

CookieJar interfaceCookieモデルに置き換えられました。これにより最新のRFCの仕様で定義されている属性を利用出来るようになったらしいです。


FormやMultipartまわりが新しくなった

FormEncodingBuilderFormBodyFormBody.Builderに、MultipartBuilderMultipartBodyMultipartBody.PartMultipartBody.Builderに置き換わり更に機能が強力になったとのことです。


Tagでリクエストを一括キャンセルする仕組みがなくなった

今までは、Requestインスタンスに設定したtagによってリクエストを一括キャンセルする方法がありましたが廃止になりました。その代わりにDispatcherqueuedCalls,runningCallsというメソッドが生えたので、直接Callインスタンスを受け取って、自分でCall#cancelをコールしてくださいとのことです。


getXXXとかsetXXXとか書くの辞めた

たしかにコード見るとget-prefixやset-prefixがないです。(Jakeがkotlinハマってる影響ですかね..)

かなり適当な訳なので、詳細はChangeLogをご確認下さい。:bow: 紹介しなかった変更点もいくつかあります。