简介:本文介绍了Android开发中常用的键值对存储方案,包括SharedPreferences、MMKV和DataStore,并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
在Android开发中,键值对存储(Key-Value Strorage)是一种经常用到的轻量级数据存储方案。它用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。
常见的键值对存储方案
SharedPreferences
SharedPreferences是Android系统提供的一种轻量级的持久化存储类,使用键值对的形式保存数据;可以存储的数据类型包括String、int、boolean、float和long;简单易用,但在高并发写操作下性能较差,会造成主线程阻塞问题。
SharedPreferences sharedPreferences = getSharedPreferences("my_preferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("username", "John");
editor.putInt("age", 30);
editor.apply(); // apply() 异步保存数据,commit() 是同步操作
特点:
存储方式:键值对(Key-Value Pairs),数据以XML文件储存。
使用方式:通常用于存储简单的用户设置、偏好设置等,适合存储少量的数据。
线程安全:在多线程的环境中操作时,需要特别注意同步问题。SharedPreferences本身是线程安全的,但你在修改数据时,可能需要使用apply()或commit()进行操作。
性能:性能较差,尤其是当存储的数据量较大时,因为它是基于文件的,数据时以文本格式存储的,且需要频繁的磁盘IO操作。
优点:
使用简单,不丢数据
使用非常方便,能确保数据的一致性,适合不频繁读写一些重要的数据。
缺点:
SP不能保证类型安全
获取数据的时候可能出现ClassCastException异常,因为使用相同的KEY调用put()保存不同类型的数据时会覆盖之前保存的数据类型。
SP加载的数据会一直留在内存中
使用getSharedPreferences()方法加载数据会将数据存储在静态的成员变量中,然后通过静态的ArrayMap缓存每一个SP文件,而每个SP文件内容通过Map缓存键值对数据,这样数据会一直留在内存中,浪费内存。
不支持多线程
SP不支持跨进程通信;代码中可以看到当使用多进程MODE_MULTI_PROCESS操作的时候,会重新读取SP文件内容。
@Override
public SharedPreferences getSharedPreferences(File file, int mode) {
SharedPreferences sp;
synchronized (ContextImpl.class){
final ArrayMap<File, SharedPreferencesImpl> cache = getSharedPreferencesCacheLocked();
sp = cache.get(file);
if(sp == null){
checkMode(mode);
if(getApplicationInfo().tragetSdkVersion >= android.os.Build.VERSION_CODES.O){
if(isCredentialProtectedStorage() && !getSystemService(UserManager.class