ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-05-29 11:12:21  阅读:249  来源: 互联网

标签: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);
    }

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

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

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

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);

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

mImageLoader.get(result.get(i), ImageLoader.getImageListener(mImageView, R.drawable.ic_logo, R.drawable.ic_action_refresh));

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

Bitmap mBitmap = VolleyInstance.getBitmapLruCache().getBitmap(result.get(2));
mIvAuthorImg.setImageBitmap(mBitmap);

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

解决方法:

Volley依赖于您实现缓存以实现成功的高效缓存.
ImageLoader的构造函数接收ImageCache,这是Volley中的一个简单接口,用于保存和加载位图.

public ImageLoader(RequestQueue queue, ImageCache imageCache)

来自ImageCache接口的Javadoc的引用:

Simple cache adapter interface. If provided to the ImageLoader, it will be used as an L1 cache before dispatch to Volley. Implementations must not block. Implementation with an LruCache is recommended.

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

你说它不起作用,也许你的实现没有针对你的用例进行优化.你使用什么样的缓存?您是否有Volley团队推荐的集中式RequestQueue和ImageLoader?

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

希望有所帮助!

编辑:

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

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

像这样的东西:

public class MyImageListener implements ImageListener() {
    @Override
    public void one rrorResponse(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
        }
    }
}

来自Javadoc:

The call flow is this:

  1. Upon being attached to a request, onResponse(response, true) will be invoked to reflect any cached data that was already available. If
    the data was available, response.getBitmap() will be non-null.

  2. After a network response returns, only one of the following cases will happen:

    • onResponse(response, false) will be called if the image was loaded.

      or

    • onErrorResponse will be called if there was an error loading the image.

标签:android,bitmap,android-imageview,android-volley
来源: https://codeday.me/bug/20190529/1177528.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有