Android 数据的传递和缓存笔记
- 分析各种数据的传递和缓存的情况
- 对应不同情况的选择
- 更多
以下都是自己的一些简单见解,有问题还请指出
分析
由于使用的场合和用途不同,我把数据的传递和缓存分成几种不同的情况
- 临时数据,需要安全高效的传递,不需要缓存
- 缓存数据,需要可持久化,不允许被自动的回收
- 缓存数据,用于提高性能,允许在内存低时回收
临时数据
-
简单的情况
比如说用户输入的一些信息,我们只需要将这些信息传递到另一个界面或者处理后显示结果,这时候就不需要对数据进行缓存。
对于这种情况,一般只要用 Intent / Bundle,就可以实现数据的传递。 -
不同组件间的通信
其实上面那种情况也包括了组件的通信,之所以分出来是因为涉及不同组件,比如 Activity、Fragment、Service 之间的通信是有很多可以讲的。
可以参考 OCNYang 写的这篇好文:
一文详尽 Android 通信:四大组件之间 & 进程间 & 线程间 & 多个App间
缓存数据,保证不丢失
比如说用户的登录信息、全局设置的状态等需要保证即使 app 被回收、重启也不能丢失的数据。
这时候一般使用 SQLitDatabase / SharedPreferences 来完成缓存。
前者是 Android 自带的小型数据库,在追求安全的时候可以使用,详情可以参考我的写的另一篇:
Database 笔记
后者将数据存储在本地的一个 xml 文件,使用比较方便也更快,同样,具体用法见于我写的另一篇:
SharedPreferences 笔记
缓存数据,提高性能
常见于一个页面加载很多从网络下载下来的图片,或者新闻列表。
为了提高性能,通常会把数据临时缓存到本地,但如果还是用数据库或者
SharedPreferences 来缓存会显得太过笨重,在清理缓存和控制内存大小方面很不方便。
这时候可以用 LruCache 来缓存数据,针对图片还有三级缓存的说法
详见于我写的另一篇 LruCache + File 图片缓存笔记
Application + ArrayMap
Application 是生命周期和 App 相同的一个类,可以用于存储传递数据,
ArrayMap 对应 JAVA 的 HashMap,用于存储数据。
上面提到的 Intent、Database、SharedPreferences 等方法的一个局限性就是只能传递或保存基本的数据类型。面对复杂的对象只能将对象序列化才行。
但假如我们在 Application 中创建一个 ArrayMap,并使用单例模式使得这个数组的实例保持唯一,这样就可以很简单快捷的实现在全局范围内传递或者保存任意类型的数据 。
这个实现可以见于我写的 Application 笔记
要注意的是这个方法如果不能正确的使用,是得不偿失的,具体..点上面的链接。