- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在我的项目中实现 NetworkBoundResource 类,这就是我正在尝试的。一切正常,得到响应,缓存但是当我在 flowBuilder 中发出值时,它会崩溃并显示这个错误。
我得到的错误:
Emission from another coroutine is detected.
Child of ProducerCoroutine{Active}@df26eb9, expected child of FlowCoroutine{Active}@a0bb2fe.
FlowCollector is not thread-safe and concurrent emissions are prohibited.
To mitigate this restriction please use 'channelFlow' builder instead of 'flow')' has been detected.
Emissions from 'catch' blocks are prohibited in order to avoid unspecified behaviour, 'Flow.catch' operator can be used instead.
For a more detailed explanation, please refer to Flow documentation.
NetworkBoundResource 类:
abstract class NetworkBoundResource<ResultType, RequestType> {
fun invoke(): Flow<Resource<ResultType>> = flow {
val rawData = loadFromDb()
if (shouldFetch(rawData)) {
fetchDataFromServer()
.onStart { emit(Resource.loading(rawData)) } // emit() causing issue
.catch { emit(Resource.error(it, null)) } // emit() causing issue
.collectLatest { }
}
}
// Save API response result into the database
protected abstract suspend fun cacheInDb(items: RequestType)
// Need to fetch data from server or not.
protected abstract fun shouldFetch(data: ResultType?): Boolean
// Show cached data from the database.
protected abstract suspend fun loadFromDb(): ResultType
// Fetch the data from server.
protected abstract suspend fun fetchDataFromServer(): Flow<ApiResponse<List<Category>>>
// when the fetch fails.
protected open fun onFetchFailed() {}
}
存储库类:
fun getCategories(): Flow<Resource<List<Category>>> {
return object : NetworkBoundResource<List<Category>, List<Category>>() {
override suspend fun cacheInDb(items: List<Category>) {
withContext(Dispatchers.IO) { database.getCategories().insert(items) }
}
override fun shouldFetch(data: List<Category>?): Boolean {
return true
}
override suspend fun loadFromDb(): List<Category> {
return withContext(Dispatchers.IO) { database.getCategories().read() }
}
override suspend fun fetchDataFromServer(): Flow<ApiResponse<List<Category>>> {
return flow { emit(RetrofitModule.getCategories()) }
}
}.invoke()
}
我的 View 模型类:
init {
viewModelScope.launch {
repository.getCategories().collectLatest {
if(it.data!=null){
_categories.value = it.data
Log.d("appDebug", " ViewModel : $it")
}
}
}
}
最佳答案
正如异常(exception)所说,冷流不允许 emit()
同时。
你有两个选择:
flow { }
与 channelFlow { }
并使用 send()
发送值(在你的情况下可能更容易)emit()
被同时调用 关于android - 违反流异常透明度 : Emission from another coroutine is detected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67582210/
写Observable最有效的方法是什么?将项目放入文本文件中,其中为每次发射写入一行?我正在使用 try-with-resources下面设置 CountDownLatch ,但由于阻塞,它绝对感觉
我正在尝试在我的项目中实现 NetworkBoundResource 类,这就是我正在尝试的。一切正常,得到响应,缓存但是当我在 flowBuilder 中发出值时,它会崩溃并显示这个错误。 我得到的
我有一个能发出一些日期的通量。此日期映射到我在某个执行器上运行的1024个模拟HTTP请求。 我想要做的是在发出下一个 Date 之前等待所有 1024 个 HTTP 请求。 当前运行时,onNext
当我使用 invokeMethod 发送方法调用时,当发送代码等待调用但目标对象随后死亡时会发生什么?这会在无限等待中结束吗?或者 Qt 会唤醒调用者并返回 false(这将是一个未记录的行为,并且是
考虑以下 Flux Flux.range(1, 5) .parallel(10) .runOn(Schedulers.parallel()) .map(i -> "https://www.
我在尝试使用 BehaviorSubject(通过 RxRelay.BehaviorRelay)存储来自连续 Observable 的最新发射时遇到问题. “连续”是指源 Observable 旨在在
我现在正在使用 Rust 编写 LLVM 教程。我已经实现了 Kaleidoscope REPL 的一些部分。它对我很有效,但突然停止工作,每次计算值的尝试都以 LLVM ERROR: Target
我正在开发一个 Android 应用程序,它要求我使用运行我的应用程序的设备发送蓝牙低发射广告。我在博客文章“您需要在 build.gradle 文件中将最低 SDK 版本设置为 21,因为在 Lol
我是一名优秀的程序员,十分优秀!