【问题标题】:How to cache data on android?如何在android上缓存数据?
【发布时间】:2016-03-02 01:17:15
【问题描述】:

我正在构建一个应用程序,我必须在其中显示图像和文本作为其标题。我已成功完成构建应用程序,我可以在其中从服务器获取数据并显示它。我的问题是我如何缓存数据(包含图像)并显示数据。例如,在 Instagram 中,我们得到一个由我们关注的所有人生成的提要,我们可以看到带有文本的图像,当我们退出应用程序并再次打开应用程序时,我们可以很容易地看到所有带有文本的图像,因为它与互联网无关。我想实现类似的东西。请帮助我。 谢谢你

【问题讨论】:

标签: java android xml caching android-volley


【解决方案1】:

您可以使用LRUCache(最近最少使用,首先丢弃最近最少使用的项目)来存储图像。来自 Android 文档:

保存对有限数量值的强引用的缓存。 每次访问一个值时,它都会移动到队列的头部。 当一个值被添加到一个完整的缓存中时,该值末尾的值 队列被驱逐,可能有资格进行垃圾回收。

这是一个内存缓存,因此我们可以缓存的图像数量是有限的。确定缓存大小以根据可用堆内存计算它的好方法。下面的代码就是一个例子

int memClass = ((ActivityManager)activity.getSystemService( Context.ACTIVITY_SERVICE)).getMemoryClass();
int cacheSize = 1024 * 1024 * memClass / 8;
LruCache cache = new LruCache<String, Bitmap>(cacheSize);

我们使用Bitmap 方法来确定放入缓存中的每个元素的大小。在这个例子中,我们使用了可用堆内存的 1/8。如果需要,应增加缓存大小。

public class AppCache extends LruCache<String, Bitmap> 
{
    public AppCache(int maxSize) 
    {
        super(maxSize);
    }

    @Override
    protected int sizeOf(String key, Bitmap value) 
    {
        return value.getByteCount();
    }

    @Override
    protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) 
    {
        oldValue.recycle();
    }

}

除此之外,请查看 “缓存位图” 上的 Android 文档,其中说:

内存缓存以占用宝贵的应用程序内存为代价提供对位图的快速访问。 LruCache 类(也可在支持库中使用回 API 级别 4)特别适合缓存位图的任务,将最近引用的对象保存在强引用的 LinkedHashMap 中,并在缓存超过其之前驱逐最近最少使用的成员指定大小。

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

【讨论】:

  • 我该如何使用它?
【解决方案2】:

需要考虑的事情 - Instagram 不会像您想象的那样缓存设备上的每张图片 - 否则您的设备内存会被耗尽,请查看一些图片加载库示例,一个好的开始可能是 Picasso by Square ,或Universal Image Loader,它们实现了您所询问的相同缓存机制,使用导致图像的url(我假设您使用凌空请求从服务器获取),但它与您当前的会话有关,加载速度非常快,因此您不会感到有什么不同,我也建议您多阅读一些内容,事情并不总是像看起来的那样:)

【讨论】:

  • 我知道... Instagram 不会缓存每张图片。他们只为主要饲料做这件事。我要问的是我该如何实现。很少有图片和标题之类的东西
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2018-08-27
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多