这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
Android 缓存设计与实现方式
在初级面试中经常遇到四大组件、五大存储、六大布局。该篇文章主要分析下Android中实现缓存的方式。
一、了解Android的存储方式
关于五大存储
大家一般期待的回答是下面这样的。
- SharedPreferences
- SQLite数据库
- ContentProvider(内容提供者)
- 文件存储
- 网络存储
还可以用另外一种方式区分,远端存储,和本地存储。
- SharedPreferences
存储目录:/data/data/<packagename>/shared_prefs/
轻量级存储,本地目录在,在正式发布的版本上,只有root才能看到。
什么是轻量? 对其环境依赖的越少,就越轻量,也就是减少耦合的意思。
- SQLite
存储目录:/data/data/<package name>/databases/
SQLite 是一个微型数据库,效率高,特别适合存储结构化的数据。Android 中内置了SQLite数据库,它支持SQL语法,但在Android中一般不直接写SQL语句,而是使用第三方库操作对象,达到对数据库增删改查的目的,比如 GreenDao。
- ContentProvider
ContentProvider 是Android存储数据的方案,底部仍然是使用SqLite。它根据Uri(Universal Resource Identifier)统一资源定位符 确定资源。可以多app使用,比如通讯录可以给多个应用获取。虽然日常开发中对 ContentProvider
使用不多,但和ContentProvider
的接触却很频繁,比如 选择一张图片,我们首先拿到的却是Uri。
- 文件存储
文件存储,分为内部存储和外部存储。
- 怎么区分内部存储和外部存储?
对用户而言可插拔的SD卡就是外部存储,焊接在手机内部的就是内部存储。
但对于开发者而言并不是这样。
在该应用目录下的存储是内部存储。
反之即使存在手机不可拆卸的存储卡上,也叫外部存储。
- 内部存储和外部存储有哪些不同?
(1) 在/data/data/package_name
目录下,在debug环境下,可以通过AndroidStudio
的Device File Explorer
查询到该app的存储,如果需要查询其它app的这个目录,则需要Root。
(2) 内部存储在应用卸载的时候会被清除,而外部存储不会。
(3) 操作内部存储目录不需要申请存储权限,而外部存储需要存储权限。这点也能理解,操作自己的应用不需要过多干预提醒。
- 网络存储
文件保存在服务器上,通过url操作服务器上的资源。比如apk的版本更新下载apk的场景。
二、拓展的存储方式
- GreenDao-操作对象即修改数据
- ACache-一个类轻松缓存
- ImageLoader/Glide-缓存图片
三、缓存设计
场景一
“我想缓存一张图片”
使用三级缓存。网络缓存(速度慢、费流量), 本地缓存,内存缓存。
首次网络加载时缓存到本地存储,缓存到内存;
当再次访问该图片时,