gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:12 24 4
gpt4 key购买 nike

问题:我有 X 数量的 ImageView,我要像这样动态添加:

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

什么希望能够点击图像并在另一个 Activity 中全屏显示它。我已经阅读了几种方法,例如传递 Uri 或将实际位图作为字节数组传递。

问题:如何获取使用 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);

图片加载不出来。我希望能够操纵图像,例如在将其传递给下一个 Activity 之前调整其大小。

最佳答案

Volley 取决于您对缓存的实现以实现成功的高效缓存。ImageLoader 的构造函数接收一个 ImageCache,它是 Volley 中用于保存和加载位图的简单接口(interface)。

public ImageLoader(RequestQueue queue, ImageCache imageCache)

引自 ImageCache 接口(interface)的 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.

Darwin 是对的。如果您请求图像并且它存在于缓存中,它将从缓存中加载,而不是从网络中加载。这应该是您的情况,因为您正在加载和呈现图像,如果单击该图像,应该会在您的新 Activity 中从缓存中显示。

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

看看this question ,与您的不完全相同,但可能对您有所帮助。它有一个简单的 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
}
}
}

来自 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 - 如何获取使用 Volley ImageLoader 下载的缓存位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17693767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com