0

我有一个NetworkImageView从 URL 加载其内容的方法,但在特定情况下,我还希望能够从用户的图库中加载图像(甚至用相机捕获图像)。

我正在使用图像选择器库从图库中加载图像,选择后,它允许我获取图像的文件路径。这条路径类似于/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

如果我尝试直接从该路径加载图像,Volley 将引发异常说明:

NetworkDispatcher.run:未处理的异常 java.lang.RuntimeException:错误的 URL/mnt/sdcard/bimagechooser/IMG_20140811_155007906.jpg

我也尝试设置drawable:

Drawable newImage = Drawable.createFromPath(imagePath);
mNetworkImageView.setImageDrawable(newImage);

这些行运行时没有任何反应,视图保持为空/未更改。

NetworkImageView在没有 URL的情况下设置内容的正确方法是什么?

4

2 回答 2

5

setImageDrawable不起作用的原因是因为 in onLayoutandsetImageUrl调用了私有方法,如果没有提供图像 url 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 的建议进行操作,手动将图像添加到图像缓存中,或者根据 Volley 创建自己的“NetworkImageView”,并且在没有提供 url 时onLayout不调用。loadImageIfNecessary然后,您可以覆盖 ImageView 设置器 setImageDrawable并将setImageURIurl 设置为 null。然后,您可以像使用 ImageView 一样使用 setImageDrawable 和 setImageURI。

setImageBitmap注意:如果您setImageResourceloadImageIfNecessary. 我还没有遇到问题,但是我没有做太多的测试。

你的班...

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);
}    

}
于 2014-09-01T19:35:24.767 回答
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);

然后再次将您的 url 发送到 NetworkImageView,Volley 会在他的缓存中找到您的 url 并将其返回给您。

我希望它有帮助!

于 2014-08-11T20:23:05.947 回答