概要
OkHttpのOkHttpClientオブジェクトを再利用することによる通信処理の効率化について記載します。
障害事象
弊社が開発しているAndroidアプリのデータ転送量が多すぎるのではないかという報告を受けました。データ転送量を測定してみると、HTTPリクエスト・レスポンスのヘッダーおよびボディサイズの合計の2.5倍程度の量が発生していました。
※このアプリの外部への通信はすべてOkHttp (ver.4) を使用して実装されています。
調査方法
Android StudioのProfilerを使用して、通信状況を調べてみることにしました。
- Androidシミュレーター (AVD) でアプリを起動する
- ツールバー > [View] > [Tool Windows] > [Profiler]
- [SESSION] の右の [+] ボタンをクリックして、起動したアプリのプロセスを選択する
- [NETWORK] をクリックする
以下の画像がそのときの状況です。[Connections] の数を見ると、単調増加していることが分かります。このことから、コネクションが再利用されていないことが問題であると推測されました。
問題点と修正内容
通信処理の実装では、リクエストの度にOkHttpClientオブジェクトを生成してたため、コネクションプールが使用されていませんでした。
以下の記事にある通り、シングルトンにして同一のOkHttpClientオブジェクトを再利用するようにしました。
修正後の効果
以下の画像は、修正後のProfilerの状況です。Connectionsの数が増えなくなりました。
また、データ転送量の合計は以前の半分程度に減りました。