DataStore

1. SharedPreferences的问题

1. 卡顿: 读写数据的时候,可能会阻塞UI线程,导致页面卡死
2. 不安全: 解析错误的时候,会直接抛出异常,导致程序崩溃
3. 没法监听: 想在数据变化时自动更新页面,SP做起来会很麻烦

2. DataStore的优势

1. 基于协程和Flow: 完全异步,不卡顿
2. 一致性保证:保证数据读写的原子性(要么成功,要么失败,不会出现数据错乱)
3. 错误处理:内置了完善的异常处理机制

3. DataStore的两种类型

DataStore提供了两种不同的实现,就像选工具箱:

  1. Preferences DataStore

    • 特点:像Map一样通过键值对存储
    • 适合场景:保存简单的数据,如布尔值、整型、字符串
    • 难度:入门级,最常用
  2. Proto DataStore
    暂时不讲

4. 如何在项目中使用
1. 添加依赖
implementation "androidx.datastore:datastore-preferences:1.2.1"


2. 创建 DataStore 实例
// 定义在文件的顶层(Class外面)
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "ble_saved_devices")

3. 定义Key
// 你需要告诉DataStore,你要存的数据叫什么名字,是什么类型
private val KEY_HSRC = stringPreferencesKey("slot_hsrc_device")
private val KEY_SPO2 = stringPreferencesKey("slot_spo2_device")

4. 写入数据
// DataStore 必须在协程中操作。我们使用.edit方法
suspend fun saveDevice(name: String, address: String) {

    val context = getContext()

    context.dataStore.edit { preferences ->
        when(type) {
            DeviceType.HSRC -> preferences[KEY_HSRC] = value
            DeviceType.SPO2 -> preferences[KEY_SPO2] = value
        }
    }
}

5. 读取数据
// DataStore返回的是一个Flow,这意味着,一旦数据变了,UI会自动收到通知
val hsrcDeviceFlow: Flow<SavedBleDevice?>
    get() {
        val context = getContext()
        return context.dataStore.data.map { preferences ->
            val value = preferences[KEY_HSRC] ?: return@map null
            parseDevice(value, DeviceType.HSRC)
        }
    }

6. 在ViewModel里面
val hsrcDeviceFlow: StateFlow<SavedBleDevice?> = BleDeviceRepository.hsrcDeviceFlow
    .stateIn(
        scope = viewModelScope,
        started = SharingStarted.WhileSubscribed(5000),
        initialValue = null
    )

7. 在Activity里面
lifecycleScope.launch {
    // 1. 监听头盒设备是否存在
    viewModel?.hsrcDeviceFlow?.collect { device ->
       
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 6,030评论 0 6
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 1,178评论 1 2
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 1,854评论 0 0
  • 跟随樊老师和伙伴们一起学习心理知识提升自已,已经有三个月有余了,这一段时间因为天气的原因休课,顺便整理一下之前学习...
    学习思考行动阅读 1,226评论 0 2
  • 一脸愤怒的她躺在了床上,好几次甩开了他抱过来的双手,到最后还坚决的翻了个身,只留给他一个冷漠的背影。 多次尝试抱她...
    海边的蓝兔子阅读 1,099评论 1 4

友情链接更多精彩内容