如何在android上缓存数据?

时间:2015-11-27 19:58:38

标签: java android xml caching android-volley

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

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

需要考虑的事项 - Instagram不会像您想象的那样缓存设备上的每个图像 - 否则您设备的内存将耗尽,看看一些图像加载库示例,一个良好的开端可能是{{3或者Picasso by Square,它们实现了你所询问的相同的缓存机制,使用一个url(我假设你是从服务器上使用一个截击请求得到的)导致图像,但它与你的相关当前会话,加载速度非常快,所以你不会感觉到差异,我也会建议阅读更多内容,事情并不像看起来那样:)