android - 是否可以在没有流的情况下从 DataStore 读取/写入原始类型?
问题描述
是否可以从 a 中读取/写入原始类型DataStore
?例如,我只想阅读一个Int
. 我不希望有任何Flow
缠绕它。很简单Int
。
解决方案
在写作方面,不使用流。您可以保存文档中概述的原语,除非您另有说明,否则这将在后台线程上完成。
对于阅读,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,阻塞其他线程会导致死锁。
因此,如果这是必要的,那么您的应用程序的总体设计可能存在问题。
推荐阅读
- docker - Docker + uWSGI + NGINX + Swagger 给出错误:socket.error: [Errno 98] 地址已在使用中
- python - Python3 找不到包模块
- c# - 如何使用继承向 .NET Core 2.0 中的 aspNetUser 表添加字段
- c++ - !=的另一种方式
- c# - 在 C# 中计算 dataGridView 中第一列的重复值
- javascript - Problem with Intersection Observer API and Bootstrap
- amazon-web-services - AWS NLB 到 ECS 集群的运行状况检查失败
- apache - 如何根据netscalar后面的apache的用户IP地址限制访问
- curl - 提取文本前缀和 url 列表到连续编号的输出行
- javascript - 如何在方法中将事件作为 arg 传递