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に動作が近づくだけで,メモリリークの主要因になったりはしない…ハズ)