如何将URL转换为位图,将它们存储在缓存中,并在Listview中显示?

时间:2014-11-01 01:23:30

标签: android caching android-imageview android-bitmap android-lru-cache

我不是要求代码,我只需要一些关于解决问题的指导。我是Android的新手,我正在做一个小项目,我从Google Images API解析JSON以获取某个关键字图像的url链接。我已经成功解析了JSON,创建了一个ListView + ArrayAdapter,并在Listview中显示了每个URL。现在我必须弄清楚如何将这些链接转换为图像(我认为使用位图),并在Listview中显示它们。我不想将它们加载到SD卡,因为这会占用每个映像的磁盘空间,而是将它们存储在缓存中。问题是,我不能使用任何第三方库进行缓存。我在谷歌搜索过,大多发现像“LazyLoad”和“Universal Image Loader”这样的东西,不幸的是它们似乎是第三方,而不是官方。我在Android开发者网站上找到了“LruCache”,但对我来说是最好的吗?你能让我知道我有什么其他选择来解决我的问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您拥有图片的网址。工作流程:

  1. 设备上是否存在图片?
    • 如果是,请将其读入内存。
    • 如果没有,请通过HTTP(S)下载。
      • 接下来,将图像保存在磁盘上的某个位置,以便下次不必重新下载。
  2. 在用户界面上显示此图片。
  3. 不要让它变得更复杂。 Volley,Univeral Image Loader等中的任何缓存机制都只是建立在同样的概念之上,对于您想要/需要完成的事情可能是不必要的。这是我为一个简单的应用程序编写的一些代码(尽管有点过时),它以非常清晰的方式执行此操作:

    if (!doesCacheFileExist(ctx, filename))
    {
        Log.d(TAG, "No cache exists. Downloading.");
        URL url = new URL(uri);
    
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
    
        Bitmap b = BitmapFactory.decodeStream(con.getInputStream());
    
        b = postProcessBitmap(b);
    
        cacheBitmap(ctx, b, filename);
    
        return b;
    }
    else
    {
        Log.d(TAG, "Found cached file.");
        return getCachedBitmap(ctx, filename);
    }
    

    完整代码可以在这里看到: https://github.com/zaventh/smartsquare/blob/develop/src/com/steelthorn/android/watch/smartsquare/Util.java#L48