【问题标题】:Module with Main dispatcher is missing缺少主调度程序的模块
【发布时间】:2019-03-11 16:06:02
【问题描述】:

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

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

【问题讨论】:

  • 使用相同的版本

标签: android kotlin coroutine kotlinx.coroutines


【解决方案1】:

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

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

【讨论】:

  • kotlinx-coroutines-corekotlinx-coroutines-android 的传递依赖,正确的解决方案是删除它。
  • 很好,马尔科!澄清一下,Marko 的意思是删除kotlinx-coroutines-core,它包含在kotlinx-coroutines-android
  • 要在 Kotlin 1.3 中使用必须使用这个实现 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
  • implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3' - 如果有人想节省几秒钟,这是最新的。
  • @MarkoTopolnik 我很困惑。它不是一个 Android 项目,而是一个普通的 Kotlin 控制台项目(在命令提示符中打印“hello world”的项目),我已经添加了 org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0 作为另一个答案的建议,我在尝试时遇到了这个运行时错误使用Dispatchers.Main。那么,即使不是Android项目,我也应该使用kotlinx-coroutines-androidkotlinx-coroutines-core-jvm 已被弃用,不应再使用?
【解决方案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

【讨论】:

  • 我的情况就是这样。我已经添加了您提供的 GitHub 页面的所有内容。非常感谢!
  • 链接的 GitHub 页面不再可用,我是 404 的
  • 没关系 cren90 。我想作为例子分享。你可以简单地按照我提到的
【解决方案3】:
./gradlew assembleDebug --rerun-tasks

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

【讨论】:

  • 我刚刚改变了我的口味,好吧!谢谢
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    同时使用 Core 和 Android 依赖项

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

    【讨论】:

    • 在接受的答案下方指出,仅使用 android 就足够了
    【解决方案6】:

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

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

    【讨论】:

    • 我也遇到了这个问题,确实似乎 AndroidDispatcherFactory 没有正确地去混淆。在 proguard 规则中,它可以工作
    【解决方案7】:

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

    对我来说,--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。

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案9】:

        好吧,就我而言,保留minifyEnabled true 是导致问题的原因。但为了实现混淆,我必须在发布版本中保留minifyEnabled 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.** { *; }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-03
          • 2018-06-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          • 2013-11-29
          • 2022-01-18
          相关资源
          最近更新 更多