VolleyライブラリNetworkImageViewのタイムアウト時間を長くする

Byraimon, 2015-07-05(日), in category Android

Android, Android Studio, Java

Android Open Source Projectでメンテナンスされている定番ネットワークライブラリVolleyには、NetworkImageView という、ネットワーク上の画像リソースを取得・表示してくれる ImageView の拡張が含まれている。

非常にお手軽で便利だが、デフォルトのタイムアウト時間が2500ミリ秒に設定されており、例えば本番環境よりも貧弱な開発環境でちょっとした画像を作って返すサーバと通信するようなケースでは、タイムアウトしてしまう事がある。

このようなケースでは ImageLoader を自前で定義したクラスと差し替える事で NetworkImageView に取得・表示する画像リソースへのリクエストタイムアウト時間を変更できる。

環境

クラスの定義

ここでは ActivityFragment の中にネストで定義している前提として書いているが、必要に応じて独立したクラスとして切り出すなどする。タイムアウト時間は10秒とした。

private static class CustomImageLoader extends ImageLoader {
    private static final int CUSTOM_TIMEOUT_MS = 10000;
    public CustomImageLoader(RequestQueue queue, ImageCache imageCache) {
        super(queue, imageCache);
    }

    @Override
    protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight,
                                                ImageView.ScaleType scaleType, final String cacheKey) {
        Request<Bitmap> request = super.makeImageRequest(requestUrl, maxWidth, maxHeight, scaleType, cacheKey);
        request.setRetryPolicy(new DefaultRetryPolicy(
                    CUSTOM_TIMEOUT_MS,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        return request;
    }
}

クラスの利用

NetworkImageView を使う箇所で、上の CustomImageLoader と差し替えて使うと、任意のタイムアウト時間設定でアクセスできる。

// ImageLoaderの生成
requestQueue = Volley.newRequestQueue(getApplicationContext());
imageLoader = new CustomImageLoader(requestQueue, imageCache);

// ImageLoaderの利用
networkImageView.setImageUrl(url, imageLoader);