关心:这里没有代码,只有文本和一些关于位图缓存的问题
我目前正在开发一个几乎完成的应用程序。我唯一想做的就是缓存图像。因为,目前,当用户打开应用程序时,应用程序会从服务器下载图像。这些图像不是静态的,这意味着它们可以每分钟/每小时/每天变化一次。我不知道它们何时会改变,因为它是由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类:FileCache
、ImageLoader
、MemoryCache
,将它们导入到你的项目中,
要下载图像,您只需调用imageLoader.DisplayImage(URL,ImageView);
最好的部分是它会照顾缓存本身,因此您不必担心
希望这有帮助