2
1

More than 5 years have passed since last update.

VolleyのNetworkImageViewでsetImageResourceしても画像が表示されなかった

Posted at

VolleyのNetworkImageViewでsetImageResourceしても画像が表示されなかった

現象

通常は画像をNetworkImageView#setImageUrlでネットワーク越しに読み込んでいたが,とある条件でローカルのリソースから読み込ませたかった.
その際,単純に

if(expression) {
    networkImageView.setImageUrl(url, imageLoader);
} else {
    networkImageView.setImageResource(R.drawble.image);
}

としていたが,表示させてみるとsetImageUrlの方は画像が表示されるのにsetImageResourceでは表示されなかった.
同様にsetImageBitmapやsetImageDrawableもダメ.

URLをセットしないと,再レイアウト時にイメージが破棄される

当該部分はここ

NetworkImageView.java
private void loadImageIfNecessary(final boolean isInLayoutPass) {
    // 略

    // if the URL to be loaded in this view is empty, cancel any old
    // requests and clear the
    // currently loaded image.
    if (TextUtils.isEmpty(mUrl)) {
        if (mImageContainer != null) {
            mImageContainer.cancelRequest();
            mImageContainer = null;
        }
        setImageBitmap(null);
        return;
    }

    // 略
}

mUrlがemptyだとsetImageBitmap(null)が呼び出されている.
このloadImageIfNecessaryはsetImageUrlしたときに呼ばれるが,オーバーライドされたonLayoutでも呼び出されているため,URLをセットしないで利用するとonLayoutが呼ばれたタイミングでセットしたリソースが破棄されてしまう.

解決

上記のsetImageBitmap(null)をコメントアウトして解決
(コメントアウトしても通常のImageViewに動作が近づくだけで,メモリリークの主要因になったりはしない…ハズ)

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1