Kho*_*han 24 android coroutine kotlin kotlinx.coroutines
我正在尝试对我的本地数据库进行后台调用,并使用协同程序使用结果更新UI.这是我的相关代码:
import kotlinx.coroutines.experimental.*
import kotlinx.coroutines.experimental.Dispatchers.IO
import kotlinx.coroutines.experimental.Dispatchers.Main
import kotlin.coroutines.experimental.CoroutineContext
import kotlin.coroutines.experimental.suspendCoroutine
class WarehousesViewModel(private val simRepository: SimRepository)
: BaseReactViewModel<WarehousesViewData>(), CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Main
override val initialViewData = WarehousesViewData(emptyList())
override fun onActiveView() {
launch {
val warehouses = async(IO) { loadWarehouses() }.await()
updateViewData(viewData.value.copy(items = warehouses))
}
}
private suspend fun loadWarehouses(): List<Warehouse> =
suspendCoroutine {continuation ->
simRepository.getWarehouses(object : SimDataSource.LoadWarehousesCallback {
override fun onWarehousesLoaded(warehouses: List<Warehouse>) {
Timber.d("Loaded warehouses")
continuation.resume(warehouses)
}
override fun onDataNotAvailable() {
Timber.d("No available data")
continuation.resume(emptyList())
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我得到一个运行时异常:
java.lang.IllegalStateException: Module with Main dispatcher is missing. Add dependency with required Main dispatcher, e.g. 'kotlinx-coroutines-android'
Run Code Online (Sandbox Code Playgroud)
我已将这些添加到我的gradle中:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.26.0'
Run Code Online (Sandbox Code Playgroud)
我对此有点新鲜,有人能帮帮我吗?
Kho*_*han 31
Tim Castelijns说,使用相同的kotlinx-coroutines版本解决了这个问题.所以在我的情况下:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1'
Run Code Online (Sandbox Code Playgroud)
您可能缺少一些Proguard规则。
我在发布版本中遇到了同样的问题,并通过添加以下规则解决了它:
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}
Run Code Online (Sandbox Code Playgroud)
使用 Core 和 Android 依赖项
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'
Run Code Online (Sandbox Code Playgroud)
如果您在使用协程 1.3.8 版时遇到此问题,请在您的proguard-rules.pro:
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8587 次 |
| 最近记录: |