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

问题:我有一定数量的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:

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.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值