旨辛チキンおいしい

よくある備忘録みたいな奴です。

Picasso が HTTP 504 エラーを報告して画像が取得できない

Picasso を使用していて HTTP 504 エラーが発生した場合、画像が表示できない原因が本当にサーバー側が HTTP 504 Gateway Timeout を返したからということとは限りません。

Picasso はキャッシュが有効になっている場合、画像をネットワークから取得できなかった時に数回(3回?) 自動的に取得をリトライしますが、最後のリトライではリクエストヘッダに Cache-Control: max-stale=2147483647, only-if-cache が付与されます。 そしてサーバーがキャッシュを応答できず、ローカルにもキャッシュが存在しない場合、 Picasso (およびその内部で Downloader として使用されている OkHttp)は HTTP 504 を報告します 1

Picasso が画像ができなかった本当の理由を隠蔽して HTTP 504 を報告してしまうため、 HTTP 504 が原因で画像が取得できなかった場合は OkHttp3Downloader に LoggingInterceptor を適用した OkHttpClient を使用するなどしてさらに詳細なログを取得する必要があります。


  1. 本当にサーバーが最後の再試行時に 504 を返してきているのか、それとも OkHttp または Picasso がそのように振る舞っているのかまで検証できませんでした。推測です。