如何获取使用Volley ImageLoader下载的缓存位图?

chr*_*olr 4 android bitmap android-imageview android-volley

问题:我有一定数量的ImageViews,我正在动态添加如下:

for (int i=2; i < result.size(); i++) {
        // instantiate image view
        ImageView mImageView = new ImageView(this);
        mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        mImageView.setBackgroundResource(R.drawable.selectable_background_theme);
        mImageView.setOnClickListener(this);

        // download image and display it
        mImageLoader.get(result.get(i), ImageLoader.getImageListener(mImageView, R.drawable.ic_logo, R.drawable.ic_action_refresh));

        // add images to container view
        mLlDescContent.addView(mImageView);
    }
Run Code Online (Sandbox Code Playgroud)

想要能够点击图像并在全屏幕中将其显示在另一个活动中的内容.我已经阅读了几种方法,例如传递Uri或将实际的Bitmap作为字节数组传递.

问题:如何获取我使用Volley ImageLoader下载的Uri或实际位图.LruCache我正在使用我在这里找到的BitmapLruCache:Android Volley ImageLoader - BitmapLruCache参数?.有人可以用这个或任何想法来帮助我实现我的目标.

我在上面的代码之后尝试了这个并没有:

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);
Run Code Online (Sandbox Code Playgroud)

编辑:如果我重新请求图像:

mImageLoader.get(result.get(i), ImageLoader.getImageListener(mImageView, R.drawable.ic_logo, R.drawable.ic_action_refresh));
Run Code Online (Sandbox Code Playgroud)

图像是从缓存加载的,但是如果我尝试直接从缓存中访问图像:

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);
Run Code Online (Sandbox Code Playgroud)

图像不加载.我希望能够操作图像,例如在将图像传递给下一个活动之前调整大小.

Ita*_*ski 5

Volley依赖于您实现缓存以实现成功的高效缓存.用于构造函数ImageLoader发生在一个ImageCache其在排球一个简单的接口,以保存和加载位图.

public ImageLoader(RequestQueue queue, ImageCache imageCache)
Run Code Online (Sandbox Code Playgroud)

来自Javadoc ImageCache接口的引用:

简单缓存适配器接口.如果提供给ImageLoader,它将在发送给Volley之前用作L1缓存.实现不得阻止.建议使用LruCache实现.

达文是对的.如果您请求图像并且它存在于缓存中,则它将从缓存而不是从Web加载.这应该是您的情况,因为您正在加载和显示图像,如果单击该图像应该从新活动的缓存中显示.

你说它不起作用,也许你的实现没有针对你的用例进行优化.你使用什么样的缓存?您是否有一个集中的RequestQueue并且ImageLoader按照Volley团队的建议?

看看这个与你的问题不完全相同的问题,但对你有所帮助.它有一个简单的LRU缓存实现.

希望有所帮助!

编辑:

Volley的观点不是担心实施细节.你想要一个图像?它将以最好和最快的方式为您加载它(从内存中,如果它不是通过网络).这正是你应该看的方式.检索缓存然后查找它不是正确的方法IMO.

现在,如果你想操作位图,你有几个选项,最好的IMO实现你自己Image Listener将它传递给get()方法而不是默认方法.

像这样的东西:

public class MyImageListener implements ImageListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        // handle errors
    }

    @Override
    public void onResponse(ImageContainer response, boolean isImmediate) {
        Bitmap bitmap = response.getBitmap();
        if (bitmap != null) {

            //                    
            // manipulations
            //

            // assuming mView is a reference to your ImageView
            mView.setImageBitmap(bitmap);
        } else {
            // display placeholder or whatever you want
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来自Javadoc:

呼叫流程如下:

  1. 在附加到请求后,将调用onResponse(response,true)以反映已经可用的任何缓存数据.如果数据可用,则response.getBitmap()将为非null.

  2. 网络响应返回后,只会发生以下一种情况:

    • 如果图像已加载,将调用onResponse(response,false).

      要么

    • 如果加载图像时出错,将调用onErrorResponse.