首页 > 解决方案 > 是否可以在没有流的情况下从 DataStore 读取/写入原始类型?

问题描述

是否可以从 a 中读取/写入原始类型DataStore?例如,我只想阅读一个Int. 我不希望有任何Flow缠绕它。很简单Int

标签: androidandroid-jetpack-datastore

解决方案


在写作方面,不使用流。您可以保存文档中概述的原语,除非您另有说明,否则这将在后台线程上完成。

对于阅读,DataStore仅出于某种原因返回流。正如@CommonsWare 在评论中所说:“读取值可能需要磁盘或其他形式的 I/O,因此他们选择实现反应式 API,以便可以在后台线程上执行 I/O。”

通过使用挂起函数,您可以Int按照您在流程上使用first()终端运算符的描述返回一个,它返回发出的第一个值。

suspend fun read(): Int {

    return dataStore.data.first()[KEY] ?: DEFAULT_VALUE
}

如果您确实需要同步调用,那么您可以runBlocking结合使用来阻止线程first(),但是正如他们在文档中警告的那样:

尽可能避免阻塞 DataStore 数据读取的线程。阻塞 UI 线程会导致 ANR 或 UI jank,阻塞其他线程会导致死锁。

因此,如果这是必要的,那么您的应用程序的总体设计可能存在问题。


推荐阅读