上文提到SharedPreferences的使用以及缺点
SharedPreferences详解_jianning-wu的博客-CSDN博客
本章节讲述DataStore的使用。
一.DataStore简介
DataStore 以异步、一致的事务方式存储数据,克服了 SharedPreferences 的一些缺点。
DataStore 提供了一种存储轻量数据的安全稳定的方案,例如配置文件,应用状态等。它不支持局部更新。
如果任何一个成员变量被修改了,整个对象都将被序列化并持久化到磁盘。对于局部修改,请考虑使用 Room 。
DataStore 保证原子性,一致性,隔离性,持久性。它是线程安全,且非阻塞的。尤其是,它解决了 SharedPreferences API 的设计缺陷。
DataStore 相比于 SharedPreferences 优点
<1> DataStore 是基于 Flow 实现的,所以保证了在主线程的安全性。
<2> 以事务方式处理更新数据,事务有四大特性(原子性、一致性、 隔离性、持久性)。
<3> 可以监听到操作成功或者失败结果。
DataStore 提供两种不同的实现。
<1> Proto DataStore:它允许您存储类型化的对象(由协议缓冲区提供支持)。
<2> Preferences DataStore:用于存储键值对。
官网
<1> DataStore | Android 开发者 | Android Developers
<2> 应用架构:数据层 - DataStore - Android 开发者 | Android Developers
下面讲解两种不同的实现方式
二.DataStore的实现方式之 Preferences DataStore
1.Gradle依赖
implementation 'androidx.datastore:datastore-preferences:1.0.0-alpha02'
2.创建对象
val dataStore: DataStore<Preferences> = context.createDataStore(
name = "settings"
)
3.读数据
val EXAMPLE_COUNTER = preferencesKey<Int>("example_counter")
val exampleCounterFlow: Flow<Int> = dataStore.data
.map { preferences ->
// No type safety.
preferences[EXAMPLE_COUNTER] ?: 0
}
4.写数据
suspend fun incrementCounter() {
dataStore.edit { settings ->
val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
settings[EXAMPLE_COUNTER] = currentCounterValue + 1
}
}
三.DataStore的实现方式之 Proto DataStore
1.Gradle依赖
implementation 'androidx.datastore:datastore-core:1.0.0-alpha02'
2.创建对象
object SettingsSerializer : Serializer<Settings> {
override fun readFrom(input: InputStream): Settings {
try {
return Settings.parseFrom(input)
} catch (exception: InvalidProtocolBufferException) {
throw CorruptionException("Cannot read proto.", exception)
}
}
override fun writeTo(
t: Settings,
output: OutputStream) = t.writeTo(output)
}
val settingsDataStore: DataStore<Settings> = context.createDataStore(
fileName = "settings.pb",
serializer = SettingsSerializer
)
3.读数据
val exampleCounterFlow: Flow<Int> = settingsDataStore.data
.map { settings ->
// The exampleCounter property is generated from the proto schema.
settings.exampleCounter
}
4.写数据
suspend fun incrementCounter() {
settingsDataStore.updateData { currentSettings ->
currentSettings.toBuilder()
.setExampleCounter(currentSettings.exampleCounter + 1)
.build()
}
}
总结:鉴于目前谷歌推出的DataStore还是alpha版本。所以还不够成熟,不能用来替代SharedPreference。但是项目中使用SharedPreference时还是要注意。