【发布时间】:2019-11-28 10:41:59
【问题描述】:
我正在尝试将我的代码从 RxJava2 迁移到 Coroutines。但我不确定如何实现。
例如,这是我将代码插入房间数据库的旧代码:
fun insert(note: Note) = Single.fromCallable {
dao.insert(note)
}.subscribeIn({ id ->
note.id = id
if (note.bitmap != null) update(note)
}
注意:这段代码在一个名为DataHelper的对象中,它包含了所有的方法和Dao对象。
这是道召:
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(note: Note): Long
尝试用协程调用替换该代码尚不清楚,因为我无法从主线程调用挂起函数。
fun insert(note: Note) {
val id = withContext(Dispatchers.IO) {
dao.insert(note)
}
note.id = id
if (note.bitmap != null) update(note)
}
dao.insert() 现在是 Dao 中的挂起函数。
将insert(Note) 函数设为挂起函数意味着我必须使用 Dispatcher 从任何地方(例如,片段)调用它。这要么意味着每个片段或活动中必须有一个 Dispatcher,要么意味着暂停整个调用线。
使用 Coroutines 运行后台线程的正确方法是什么?
【问题讨论】:
-
如果您不想在每个 activity/fragment 中创建
CoroutineContext,然后使用GlobalScope在 insert 方法中调用您的函数,尽管这样做不是最佳实践做。
标签: android kotlin rx-java2 kotlin-coroutines