私のアプリには現在OkHttpClient
、次の目的で使用されるもの (v3.2.0) があります。
- レトロフィット
- ピカソ
- クラウド メディア サービスへの画像/動画のアップロード
- 使用する
HttpDataSource
ビデオ用ExoPlayer
(実装はこちら)
OkHttpClients
Retrofit とメディアのユース ケースを別々に使用したい理由は次のとおりです。
- キャッシュを分けておきたい
- メディアには、レトロフィットのものにはない
OkHttpClient
特定のものがありますInterceptors
変更を行った後、各インスタンスにOkHttpClient
独自のCache
;を提供します。どちらもアプリのキャッシュ ディレクトリにあり、1 つは directory を使用し、http
もう 1 つは を使用しmedia
ます。両方のインスタンスは同じように設定されます (同じ と を使用しCookieJar
ますInterceptors
。Builders
唯一の違いは、Cache
それらに渡される異なるインスタンスがあることです)。キャッシュはピカソと完全に連携しますが、OkHttpDataSource
.
渡される URL はOkHttpDataSource
、クラウド メディア サービスにリダイレクト (302) するアプリケーション サーバーのエンドポイントです。これは、画像/ピカソに使用するのと同じプロセスであり、正常に機能します。
キャッシュの基本的なテスト手順は次のとおりです。
- を使用し
OkHttpDataSource
てビデオを再生します (私のアプリケーション サーバーは正しいキャッシュ ヘッダーを送り返します)。 - アプリを FC して再度開く
- デバイスを機内モードにする
- を使用し
OkHttpDataSource
てビデオを再生します (インターネット接続がない場合でも再生する必要があります)。
私が1つを使用すると、OkHttpClient
すべて正常に動作します。上記のように 2 つのインスタンスを使用すると、アプリケーション サーバーからの応答がキャッシュされます (302) が、Location
ヘッダーを解決しようとするIOException
と、アドレスを解決できないというメッセージがスローされます。繰り返しますが、これは、 のインスタンスを 1 つしか使用しない場合には発生しませんOkHttpClient
。さらに、インスタンスが 2 つある場合、Retrofit インスタンスを に使用するOkHttpDataSource
と、キャッシュが正常に機能します。
デバッグで何が起こっているのかを把握しようとしていましたDiskLruCache
が、デバッガーを接続していると副作用があるようで、苦労していました。私が観察できたのは、リダイレクトされた URL のキャッシュ エントリDiskLruCache.Entry.readable
が常に に設定されていたため、状況によっては削除されていたことfalse
です。私が知る限り、これは でDiskLruCache.completeEdit
呼び出されたためでしたがsuccess = false
、なぜそうなったのかはわかりません。の 1 つのインスタンスのみを使用する場合OkHttpClient
、または のメディア インスタンスの代わりに REST インスタンスを使用する場合も、これは問題ではありませんでしたOkHttpDataSource
。