【问题标题】:Use Bitmap Caching the correct way正确使用位图缓存
【发布时间】:2013-11-20 05:19:10
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: android image caching bitmap


    【解决方案1】:

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

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

    });

    【讨论】:

    • 感谢您的回答,但在这里我再次提出问题,如果我也可以将毕加索的位图保存在位图变量中。喜欢Bitmap bitmap = picasso.with(context).load(url) 然后在文本视图旁边使用它Drawable d = new BitmapDrawable(getResources(), bitmap); textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null);
    • 是的。这真是一个很棒的图书馆。我将它用于复合绘图。检查我的编辑。
    • @JakeWharton 在 github.com/square/picasso/issues/308 的最后一条评论中对此进行了解释。
    【解决方案2】:

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

    【讨论】:

    • 嗨,我已经看到了那个库,但是有一个问题。我还在下载 Favicon 并将它们显示在带有 setCompoundDrawablesWithInstricBounds 的文本视图旁边 - 该库是否可以将结果保存到位图而不是直接将其显示到图像视图中?所以我可以将它设置在 TextView 旁边?
    • 是的,您应该扩展 AjaxCallback 并在显示 bmp 之前检查它是否未使用 aq.getCachedImage() 进行缓存。看看我编辑的答案。
    【解决方案3】:

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

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

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

    下载图片,您只需致电imageLoader.DisplayImage(URL,ImageView);

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 2014-02-05
      • 2013-12-29
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多