Android缓存的简介

文章写给最近在面试的人员。
首先开发中,对于网络数据以及特定的本地数据我们都会对其进行缓存处理。Android的本地缓存有四种,其中最简单的当然是android提供的SP,它以最简单的键值对方式来存放数据。这个键值对只能存放一些基本的数据类型,而且也不建议存放数据量特别大的数据。
其次是数据库格式,也就是android提供的sqlite数据库,其存放方式就和别的数据库基本一样,这边只是做一个简单的介绍,并不会去深入的去介绍如何使用。
曾经有个面试官问过我:数据库能不能存放图片?
以前没文化不懂啊,就瞎猜了一下。现在这边可以告诉大家,数据库是无法存放二进制文件的,但是如果我们对二进制文件进行一定的转码,之后我们就可以将二进制文件存放进数据库里了。介绍一下将二进制文件的可以通过一些特定的加密格式把byte数组转化成string串保存进数据库。
之后我们同样可以保存一个file文件的方式来做本地缓存。这个file格式并不仅仅只是txt文档而已,图片,音乐等等都能以file格式进行保存。所谓的图片的二级缓存其实就是将网络图片先以file格式缓存到本地。后面的我们等下会介绍。如何存储的话当然是以流的格式进行存储。当然这个地方有个坑爹的地方,就是如果文件过大的话,是不能将所有的二进制流直接获取到内存中再写成文件的,而要对其进行边缓存边写的操作,这样才不会引发oom。
Contentprovider是android提供的最后一个数据缓存的方式,个人觉得其实这个可以相当于一个外部app可以调用的数据库,他们的链接方式是通过uri来进行的。具体的因为没有怎么使用,这里也就只是提一下而已。
之后我们要介绍的就不是disk缓存了,而是内存缓存。
首先我们可以通过在一个app的一个长生命周期的类中开辟一块内存,专门来保存那些我们可能要经常使用的数据,这样他的调用速度会比从数据库,或者disk中的速度更加快。方式可以通过生成一个单例,或者在application类中开辟一个集合的形式去专门做内存缓存。
内存缓存的速度会远远快与本地缓存,这点可以参照我们的imageloader这个第三方类库,因为去生成或者实例化一张bitmap是一件非常耗时的事情,imageloader就是相当于省去了去加载bitmap这个过程,直接从内存中抓出了这个类。
其实图片缓存类,我们可以讲的东西很多,首先图片缓存类的最核心部分其实就是基于一个LRU的数据缓存。百度抄一段翻译啊。LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。这里就可以看出来。简单的说,我们可以理解为一个可以自动释放多余内存的一个hashmap,之后我们通过键值对去存放这些bitmap。其次是当我们在加载一些分辨率非常高的图片的时候也需要注意一些地方。

    private static Bitmap GetBitmapFromResource(Context context, int resid,
            int Width, int Height) {
        try {
            // 获得图片大小
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),
                    resid, options);
            // 获得采样比例
            int inSampleSize = options.outWidth / Width;
            if ((options.outHeight / Height) < inSampleSize) {
                inSampleSize = options.outHeight / Height;
            }
            if (inSampleSize <= 0)
                inSampleSize = 1;
            options.inSampleSize = inSampleSize;
            // 获得图片
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            options.inJustDecodeBounds = false;
            options.inPurgeable = true;
            options.inInputShareable = true;
            bmp = BitmapFactory.decodeResource(context.getResources(), resid,
                    options);
            return bmp;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

从上面的代码可以看出来,当加载一张图片的时候我们最好通过两次加载图片,第一次我们只是加载图片的一些基本数据,图片的宽高,之后我们在通过丰富这个options里的属性去完全的把这张图片加载到手机内存中。

上面这些就是我这种渣渣拿来和面试官们侃的一些东西,大家如果知道的更多,欢迎留言补充啊。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值