缺少带有主调度程序的模块

Module with Main dispatcher is missing

提问人:Khongor Bayarsaikhan 提问时间:10/6/2018 最后编辑:EdricKhongor Bayarsaikhan 更新时间:3/14/2023 访问量:32733

问:

我正在尝试对本地数据库进行后台调用,并使用协程使用结果更新 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'

我已经将这些添加到我的评分中:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.26.0'

我对此有点陌生,有人可以帮我吗?

Android Kotlin 协程 kotlinx.coroutines

评论

6赞 Tim 10/6/2018
使用相同的版本

答:

76赞 Khongor Bayarsaikhan 10/6/2018 #1

仅使用 kotlinx-coroutines-android 版本即可解决问题。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1'

评论

20赞 Marko Topolnik 10/26/2018
kotlinx-coroutines-core是 的传递依赖项,正确的解决方案是删除它。kotlinx-coroutines-android
4赞 Herbal7ea 5/23/2019
好抓马尔科!澄清一下,Marko 的意思是删除,它包含在kotlinx-coroutines-corekotlinx-coroutines-android
0赞 Alexei 6/11/2019
要在 Kotlin 1.3 中使用,必须使用以下实现“org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1”
1赞 DJ. Aduvanchik 11/7/2020
实现“org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3” - 如果有人想节省几秒钟,则这是最新的。
1赞 Damn Vegetables 1/1/2022
@MarkoTopolnik我很困惑。它不是一个 Android 项目,而是一个普通的 Kotlin 控制台项目(在命令提示符下打印“hello world”的项目),我已经按照另一个答案的建议进行了添加,并且在尝试使用时遇到了这个运行时错误。那么,即使它不是Android项目,我也应该使用吗? 已弃用,不应再使用?org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0Dispatchers.Mainkotlinx-coroutines-androidkotlinx-coroutines-core-jvm
18赞 Ganesh Kanna 12/28/2018 #2

您可能缺少一些 Proguard 规则

我在发布版本中遇到了同样的问题,并通过添加以下规则解决了它:

-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}

https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/kotlinx-coroutines-android/example-app/app/proguard-rules.pro 相比

评论

1赞 Lucas P. 3/12/2019
我的情况就是这样。我已经在您提供的 GitHub 页面中添加了所有保留项。谢谢!
2赞 cren90 12/21/2019
链接的 GitHub 页面不再可用,对我来说是 404
0赞 Ganesh Kanna 12/22/2019
没关系 cren90 .我想分享一个例子。您可以简单地按照我提到的内容进行操作
1赞 Pnemonic 9/22/2022
如果模块是一个库,可以把它放进去consumer-rules.pro
4赞 Gabor 10/3/2019 #3
./gradlew assembleDebug --rerun-tasks

如果上述答案对您不起作用,则修复它(因为您已经有所需的依赖项,并且您使用的是不需要 proguard 规则的 R8)。

评论

0赞 Pierry 10/26/2019
我只是改变了我的口味,好吧!谢谢
4赞 MOHSEN ALIAKBARI 3/25/2020 #4

“core”是当前版本“kotlinx-coroutines”中“android”版本的传递依赖,因此只能使用“android”

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0'
11赞 Mohamed AbdelraZek 5/10/2020 #5

同时使用 Core 和 Android 依赖项

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'

评论

0赞 Khongor Bayarsaikhan 5/11/2020
正如接受的答案下面所指出的,仅使用 Android 就足够了
10赞 Saurabh Thorat 8/10/2020 #6

如果您在使用 1.3.8 版协程时遇到此问题,请在您的 :proguard-rules.pro

-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}

评论

1赞 Alessandro Mautone 8/11/2020
我也遇到了这个问题,确实似乎没有正确进行反混淆。有了这个在 proguard 规则中,它就可以工作了AndroidDispatcherFactory
3赞 makingthematrix 8/27/2020 #7

如果有人尝试上面的解决方案但没有奏效,只是一个额外的提示。

对我来说,没有帮助。取而代之的是,一条规则完成了这项工作:--no-build-cacheproguard-rules.txt

-keep class kotlinx.coroutines.android.** {*;}

我的设置是,不(我删除了它,因为它被证明是不必要的)、Kotlin 1.3.72 和 Gradle 3.2.1。kotlinx-coroutines-android:1.3.9kotlinx-coroutines-core

3赞 Mujahid Khan 10/3/2020 #8

我已经通过执行两个版本相同的“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
2赞 Vishal Naikawadi 11/27/2020 #9

好吧,就我而言,保持是导致问题的原因。但是为了实现混淆,我必须保留发布版本。因此,我进行了以下更改。minifyEnabled trueminifyEnabled true

//keep only 
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8'

在您的 proguard-rules.pro 中添加

-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}

我还需要在 proguard-rules.pro 中添加用于通过改造进行 API 调用的模型类

-keep class com.example.test.login.data.model.** { *; }
-keepclassmembers class com.example.test.login.data.model.** { *; }
1赞 NIKUNJ DHAMI 3/14/2023 #10

由于启用了 proguard,我收到了此错误

-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepclassmembernames class kotlinx.** {
   volatile <fields>;
}

在 proguard-rules.pro 中添加上述规则