在DB中访问Android图像

时间:2016-02-02 16:44:24

标签: android sqlite android-asynctask picasso

这是一个具有画廊背景的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链接。

或直接将图像缓存到光盘?

7 个答案:

答案 0 :(得分:3)

这里有几个问题需要注意:

  1. onPostExecute在主线程上运行。不是做磁盘IO的好地方。当图像显示时,UI会不时冻结。

  2. 仅限有限大小(Benchmark),SqLite blob比普通磁盘文件快。因此,大文件最好存储在磁盘上。

  3. 如果您想在图像上缓存延迟加载,建议使用Picasso。问题是毕加索不能轻易地使用你的自定义" DB作为缓存"解。它使用通用HTTP缓存。因此,可以定期使缓存的文件无效并清除。

  4. 如果您想要完全自定义HTTP和图片加载,请尝试使用Volley。

答案 1 :(得分:1)

我建议您使用缓存,考虑使用Sergey Tarasevich(GitHub)的Universal Image Loader

它允许对下载的图像进行详细的缓存管理,具有许多配置

  
      
  • UsingFreqLimitedMemoryCache - >超出缓存大小限制时,将删除最不常用的位图。
  •   
  • LRULimitedMemoryCache: - >超出缓存大小限制时,将删除最近最少使用的位图。
  •   
  • FIFOLimitedMemoryCache: - >当超过缓存大小限制时,FIFO规则用于删除。
  •   
  • LargestLimitedMemoryCache: - >超出缓存大小限制时,将删除最大的位图。
  •   
  • LimitedAgeMemoryCache:>当Cached对象的年龄超过定义的值时,将删除该对象。
  •   
  • WeakMemoryCache: - >内存缓存,只对位图有弱引用。
  •   

答案 2 :(得分:1)

要在android中缓存图像,有一定的机制。

  1. LruCache
  2. DiskCache
  3. 存储在DB
  4. 如果图像不大而且不多(2-3 KB)并且它们的集合不应该被扩展然后您可以将它们保存到db。 但是写它们会更难,阅读它们。另一方面,用户将无法使用它们做任何事情。

    否则,如果您想让用户扩展图像集或图像相当大,您应该将它们存储到 SD卡(磁盘缓存)

      

    注意: - 我建议将Glide库与磁盘缓存机制一起使用

    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的神奇图书馆!