我有一个NetworkImageView
从URL加载其内容,但在特定情况下,我还希望能够从用户的图库中加载图像(甚至可以使用相机捕获图像)。
我使用Image Chooser Library从图库中加载图片,选择后,它可以让我获取图片的文件路径。此路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg
如果我尝试直接从此路径加载图像,Volley将引发一个异常声明:
NetworkDispatcher.run:未处理的异常java.lang.RuntimeException:错误的网址
/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg
我也试过设置drawable:
Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);
当这些线条运行时没有任何反应,视图保持空白/不变。
在没有网址的情况下设置NetworkImageView
内容的正确方法是什么?
答案 0 :(得分:5)
setImageDrawable
不起作用的原因是因为在onLayout
和setImageUrl
中调用私有方法loadImageIfNecessary
,如果调用另一个私有方法setDefaultImageOrNull
没有提供图像网址。这会消除您通过setImageDrawable
设置的任何内容。
Volley的NetworkImageView代码......
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
loadImageIfNecessary(true);
}
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;
}
setDefaultImageOrNull();
return;
}
...
}
private void setDefaultImageOrNull() {
if(mDefaultImageId != 0) {
setImageResource(mDefaultImageId);
}
else {
setImageBitmap(null);
}
}
您可以像@mmlooloo建议的那样,手动将图像添加到图像缓存中,或者创建自己的" NetworkImageView"在没有提供网址的情况下,基于Volley&onLayout
loadImageIfNecessary
不致电setImageDrawable
。然后,您可以覆盖ImageView设置器setImageURI
和setImageBitmap
以将url设置为null。然后,您可以像使用ImageView一样使用setImageDrawable和setImageURI。
注意:如果您覆盖setImageResource
或loadImageIfNecessary
方法,则可能会遇到问题,因为这些方法是在public class MyNetworkImageView extends ImageView {
//Copy the code from Volley's NetworkImageView and change onLayout as below.
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(mUrl)) {
loadImageIfNecessary(true);
}else{
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
}
}
//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
mUrl = null;
super.setImageDrawable(drawable);
}
@Override
public void setImageURI(Uri uri) {
mUrl = null;
super.setImageURI(uri);
}
}
内调用的。我还没有遇到问题,但是我没有做太多测试。
你的班级......
{{1}}
答案 1 :(得分:0)
我不确定,但值得一试:
当您为mImageLoader创建内存缓存时,请将其保留在某处,现在为您的
创建缓存密钥此代码的图片:
private static String getCacheKey(String url, int maxWidth, int maxHeight) {
return new StringBuilder(url.length() + 12).append("#W").append(maxWidth)
.append("#H").append(maxHeight).append(url).toString();
}
之后通过调用:
将图像放入缓存中 mCache.putBitmap(cacheKey, response);
然后再次将您的网址发送到NetworkImageView,Volley将在其缓存中找到您的网址并将其返回给您。
我希望它有所帮助!!