缺少主调度程序的模块
Module with Main dispatcher is missing
我正在尝试对我的本地数据库进行后台调用,并使用协程使用结果更新 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())
}
})
}
}
我的问题是出现运行时异常:
java.lang.IllegalStateException: Module with Main dispatcher is missing. Add dependency with required Main dispatcher, e.g. 'kotlinx-coroutines-android'
我已经将这些添加到我的 gradle:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.26.0'
我对此有点陌生,有人可以帮助我吗?
仅使用 kotlinx-coroutines-android 版本即可解决问题。
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1'
您可能遗漏了一些 Proguard 规则。
我在发布版本中遇到了同样的问题,并通过添加以下规则解决了这个问题:
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}
./gradlew assembleDebug --rerun-tasks
如果上述答案对您不起作用,请修复它(因为您已经拥有所需的依赖项并且您正在使用不需要混淆器规则的 R8)。
"core" 是 "android" 版本在当前版本 "kotlinx-coroutines" 中的传递依赖,所以只使用 "android"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
同时使用核心和 Android 依赖项
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'
如果您在使用协程版本 1.3.8 时遇到此问题,请将此规则添加到您的 proguard-rules.pro
:
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
如果有人尝试了上面的解决方案但没有奏效,只是一个额外的提示。
对我来说,--no-build-cache
没有帮助。相反,proguard-rules.txt
中的一条规则完成了这项工作:
-keep class kotlinx.coroutines.android.** {*;}
我的设置是kotlinx-coroutines-android:1.3.9
,没有kotlinx-coroutines-core
(我删除了它,因为它原来是不必要的),Kotlin 1.3.72,和Gradle 3.2.1。
我已经通过相同的两个版本进行了修复
'kotlinx-coroutines-android' 并确保它与 'kotlinx-coroutines-core'
具有相同的版本
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5'//same as coroutines-android
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5"//same as coroutines-core
好吧,就我而言,保留 minifyEnabled true
是造成问题的原因。但是为了实现混淆,我必须在发布版本中保留 minifyEnabled true
。所以我做了以下更改。
//keep only
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'
在你的混淆器中-rules.pro 添加
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
我还需要在 proguard-rules.pro[=15= 中通过改造 添加用于 API 调用的 模型 类 ]
-keep class com.example.test.login.data.model.** { *; }
-keepclassmembers class com.example.test.login.data.model.** { *; }
我正在尝试对我的本地数据库进行后台调用,并使用协程使用结果更新 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())
}
})
}
}
我的问题是出现运行时异常:
java.lang.IllegalStateException: Module with Main dispatcher is missing. Add dependency with required Main dispatcher, e.g. 'kotlinx-coroutines-android'
我已经将这些添加到我的 gradle:
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.26.0'
我对此有点陌生,有人可以帮助我吗?
仅使用 kotlinx-coroutines-android 版本即可解决问题。
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1'
您可能遗漏了一些 Proguard 规则。
我在发布版本中遇到了同样的问题,并通过添加以下规则解决了这个问题:
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** {
volatile <fields>;
}
./gradlew assembleDebug --rerun-tasks
如果上述答案对您不起作用,请修复它(因为您已经拥有所需的依赖项并且您正在使用不需要混淆器规则的 R8)。
"core" 是 "android" 版本在当前版本 "kotlinx-coroutines" 中的传递依赖,所以只使用 "android"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
同时使用核心和 Android 依赖项
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'
如果您在使用协程版本 1.3.8 时遇到此问题,请将此规则添加到您的 proguard-rules.pro
:
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
如果有人尝试了上面的解决方案但没有奏效,只是一个额外的提示。
对我来说,--no-build-cache
没有帮助。相反,proguard-rules.txt
中的一条规则完成了这项工作:
-keep class kotlinx.coroutines.android.** {*;}
我的设置是kotlinx-coroutines-android:1.3.9
,没有kotlinx-coroutines-core
(我删除了它,因为它原来是不必要的),Kotlin 1.3.72,和Gradle 3.2.1。
我已经通过相同的两个版本进行了修复 'kotlinx-coroutines-android' 并确保它与 'kotlinx-coroutines-core'
具有相同的版本// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5'//same as coroutines-android
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5"//same as coroutines-core
好吧,就我而言,保留 minifyEnabled true
是造成问题的原因。但是为了实现混淆,我必须在发布版本中保留 minifyEnabled true
。所以我做了以下更改。
//keep only
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'
在你的混淆器中-rules.pro 添加
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
我还需要在 proguard-rules.pro[=15= 中通过改造 添加用于 API 调用的 模型 类 ]
-keep class com.example.test.login.data.model.** { *; }
-keepclassmembers class com.example.test.login.data.model.** { *; }