要确保在Androidx中只创建了一个数据存储实例,可以使用单例模式来实现。以下是一个示例代码:
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.createDataStore
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.withContext
object DataStoreSingleton {
private var dataStore: DataStore ?= null
fun getDataStore(context: Context): DataStore {
synchronized(this) {
if (dataStore == null) {
dataStore = context.createDataStore(name = "my_data_store")
}
return dataStore!!
}
}
suspend fun saveValue(context: Context, key: String, value: String) {
withContext(Dispatchers.IO) {
val dataStore = getDataStore(context)
dataStore.edit { preferences ->
preferences[preferencesKey(key)] = value
}
}
}
suspend fun readValue(context: Context, key: String): Flow {
return getDataStore(context).data
.map { preferences ->
preferences[preferencesKey(key)]
}.flowOn(Dispatchers.IO)
}
}
// 使用示例:
class MyViewModel : ViewModel() {
fun saveValue(context: Context, key: String, value: String) {
viewModelScope.launch {
DataStoreSingleton.saveValue(context, key, value)
}
}
fun readValue(context: Context, key: String): Flow {
return DataStoreSingleton.readValue(context, key)
}
}
在上面的示例中,DataStoreSingleton
是一个单例类,负责管理数据存储实例。getDataStore
方法使用了双重检查锁定来确保只创建了一个数据存储实例。saveValue
和readValue
方法用于保存和读取数据。
在MyViewModel
中使用DataStoreSingleton
来保存和读取数据。通过在viewModelScope
中调用相应的方法,可以在后台线程中执行数据存储操作。readValue
方法返回一个Flow
,用于观察数据的变化。
需要注意的是,上述示例使用了Preferences
作为数据存储的类型,你可以根据实际需求来选择适合的类型。