是否可以在没有流的情况下从 DataStore 读取/写入原始类型?

Use*_*ase 8 android android-jetpack-datastore

是否可以只从 a 读取/写入原始类型DataStore?例如,我只想阅读一个Int. 我不想让任何东西Flow包裹在它周围。只是简单Int

Hen*_*ist 6

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

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

通过使用挂起函数,您只需Int使用first()流程上的终端运算符即可返回您所描述的,该操作符返回发出的第一个值。

suspend fun read(): Int {

    return dataStore.data.first()[KEY] ?: DEFAULT_VALUE
}
Run Code Online (Sandbox Code Playgroud)

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

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

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