-1

关心:这里没有代码,只有文本和一些关于位图缓存的问题

我目前正在开发一个几乎完成的应用程序。剩下的唯一一件事就是缓存图像。因为,目前,当用户打开应用程序时,应用程序会从服务器下载图像。这些图像不是静态的,这意味着它们可以每分钟/每小时/每天更改一次。我不知道它们什么时候发生变化,因为它是由 twitter 分享量、facebook 喜欢等收集的图像列表。这意味着,当一张图片有 100 个喜欢和 100 条推文时,它是位置 1。但是当另一张图片获得更多点赞和推文获得排名 1,另一个排名为 2。这不完全是我的应用程序,但只是为了让您了解原理。

现在我研究了位图缓存,这样用户就不必一遍又一遍地下载相同的图像。我的问题是我该怎么做?我的意思是,我了解如何缓存位图。

我查看了这篇文档文章:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

但是,问题是,我如何知道位图是否已经下载并已被缓存,或者我是否必须再次下载?我不需要先下载图像来检查我的系统中是否已经有这个特定的图像吗?

我想过获取图像的 URL,然后将其转换为哈希。然后,使用哈希作为文件名将文件保存到缓存中。然后,当图像 URL 出现时,将检查图像是否在缓存中可用。如果是,它将被加载,如果不是,它将被下载。那会是这样吗?

或者我是否误解了位图缓存并且它已经从它自己开始了?

4

3 回答 3

2

对于这些情况,我最好的建议是:不要试图重新发明轮子。

图像加载/缓存在 Android 中是一项非常复杂的任务,许多优秀的开发人员已经这样做了。只需重新使用他们的工作。

我个人的偏好是毕加索http://square.github.io/picasso/

用它加载东西是一个非常简单的代码行:

Picasso.with(context).load(url).into(imgView);

就这么简单!

它同时进行 RAM 和磁盘缓存,处理所有线程问题并使用出色的网络层 okHttp。

编辑:

要直接访问位图,您可以:

Picasso.with(context).load(url).into(new Target() {
  void onBitmapLoaded(Bitmap bitmap, LoadedFrom from){
      // this will be called on the UI thread after load finishes 
  }

  void onBitmapFailed(Drawable errorDrawable){
  }

  void onPrepareLoad(Drawable placeHolderDrawable){
  }

});

于 2013-11-08T09:39:04.273 回答
1

检查这个库: http ://code.google.com/p/android-query/wiki/ImageLoading

它会自动缓存

例子

//fetch a remote resource in raw bitmap

String url = "http://www.vikispot.com/z/images/vikispot/android-w.png";

aq.ajax(url, Bitmap.class, new AjaxCallback<Bitmap>() {

        @Override
        public void callback(String url, Bitmap object, AjaxStatus status) {

        }
});.

http://code.google.com/p/android-query/wiki/AsyncAPI

于 2013-11-08T09:02:24.943 回答
0

你可以试试https://github.com/thest1/LazyList

该项目代码是为列表视图设计的,但它的目的仍然是从背景中的 URL 下载图像,因此用户不必等待整个下载时间。

你把这些 JAVA 类 : FileCache, ImageLoader, MemoryCache, 导入到你的项目中,

用于下载您刚刚调用的图像imageLoader.DisplayImage(URL,ImageView);

最好的部分是它会处理缓存本身,因此您不必担心

希望这可以帮助

于 2013-11-08T09:03:42.143 回答