这是一个具有画廊背景的APP。使用 REST 我收到(Volley)JSON,其中包含有关地点和图片链接的信息。因为大约有60个地方,所以缓存形式 PICASSO 是不够的。数据存储在数据库中,所以我的想法是将图像作为byte stream
插入数据库。它完成了,但不是很好,如下所示。 AsyncTask
内的代码。
@Override
protected Bitmap doInBackground(Void... params) {
try {
return Picasso.with(context)
.load(site.getImageURL())
.get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
} catch (Exception e) {
e.printStackTrace();
}
site.setImageBytes(stream.toByteArray());
db.openForWrite();
db.updateSite(site.getId(), site);
db.close();
}
我的问题是如何提高效率,你知道更好的方法吗?我尝试callback
向Picasso添加图像到数据库onSuccess
,但它需要将视图作为第一个参数。
也许有一种很好的方法可以将图像保存到SD卡,并用SD卡上的图像位置替换HTTP链接。
或直接将图像缓存到光盘?
答案 0 :(得分:3)
这里有几个问题需要注意:
onPostExecute
在主线程上运行。不是做磁盘IO的好地方。当图像显示时,UI会不时冻结。
仅限有限大小(Benchmark),SqLite blob比普通磁盘文件快。因此,大文件最好存储在磁盘上。
如果您想在图像上缓存延迟加载,建议使用Picasso。问题是毕加索不能轻易地使用你的自定义" DB作为缓存"解。它使用通用HTTP缓存。因此,可以定期使缓存的文件无效并清除。
如果您想要完全自定义HTTP和图片加载,请尝试使用Volley。
答案 1 :(得分:1)
我建议您使用缓存,考虑使用Sergey Tarasevich(GitHub)的Universal Image Loader库
它允许对下载的图像进行详细的缓存管理,具有许多配置
- UsingFreqLimitedMemoryCache - >超出缓存大小限制时,将删除最不常用的位图。
- LRULimitedMemoryCache: - >超出缓存大小限制时,将删除最近最少使用的位图。
- FIFOLimitedMemoryCache: - >当超过缓存大小限制时,FIFO规则用于删除。
- LargestLimitedMemoryCache: - >超出缓存大小限制时,将删除最大的位图。
- LimitedAgeMemoryCache:>当Cached对象的年龄超过定义的值时,将删除该对象。
- WeakMemoryCache: - >内存缓存,只对位图有弱引用。
答案 2 :(得分:1)
要在android中缓存图像,有一定的机制。
如果图像不大而且不多(2-3 KB)并且它们的集合不应该被扩展然后您可以将它们保存到db。 但是写它们会更难,阅读它们。另一方面,用户将无法使用它们做任何事情。
否则,如果您想让用户扩展图像集或图像相当大,您应该将它们存储到 SD卡(磁盘缓存)。
注意: - 我建议将Glide库与磁盘缓存机制一起使用
考虑空间不足并妥善处理这些案件。
答案 3 :(得分:0)
也许有一种很好的方法可以将图像保存到SD卡,然后更换 带有SD卡上图像位置的HTTP链接。
或直接将图像缓存到光盘?
这正是我要做的。如果图像存在,请查看SD上的缓存,如果是,则使用它,如果不将其下载到缓存并从缓存中使用它。但是你需要照顾TTL-s。
答案 4 :(得分:0)
@Biju Parvathy答案还可以,但自11月27日起,Universal Image Loader已经停止了项目的维护。您可以在github page
中看到它我认为一个非常好的选择是使用Fresco Library。来自Facebook并支持local storage cache和许多其他事情。一些缓存属性是:
位图缓存
编码内存缓存
磁盘缓存
使用一个或两个磁盘缓存
它非常易于使用,下载图像的时间非常快。它还支持progressive JPEG images over the network的流式传输。
答案 5 :(得分:0)
如您所见," bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);" method接受输出流来保存位图。
只需使用FileOutputStream并选择保存图像的位置即可!
答案 6 :(得分:0)
试试fresco。这是来自facebook的神奇图书馆!