以正确的方式使用位图缓存



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

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

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

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

但是,问题是,我

如何知道位图是否已下载并已缓存,或者我是否必须再次下载?我不必先下载图像来检查我的系统中是否已有此特定图像吗?

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

还是我误解了位图缓存,它已经自己做了?

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

图像加载/缓存在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){
  }

});

检查此库: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

你可以

试试 https://github.com/thest1/LazyList

项目代码是为Listviews设计的,但它的目的仍然是从背景中的URL下载图像,这样用户就不必保留整个下载时间。

你把这些JAVA类:FileCacheImageLoaderMemoryCache,将它们导入到你的项目中,

要下载图像,您只需调用imageLoader.DisplayImage(URL,ImageView);

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

希望这有帮助

最新更新