带有主调度程序的模块丢失

问题描述 投票:0回答:11

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

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

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

18
投票

您可能缺少一些 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


11
投票

同时使用 Core 和 Android 依赖项

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

10
投票

如果您在使用协程版本 1.3.8 时遇到此问题,请在您的

proguard-rules.pro
中添加此规则:

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

4
投票
./gradlew assembleDebug --rerun-tasks

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


4
投票

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

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

3
投票

如果有人尝试上面的解决方案但不起作用,只是一个额外的提示。

对我来说,

--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。


3
投票

我已经修复了两个版本相同的问题 '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
投票

好吧,就我而言,保留

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.** { *; }
    

2
投票
由于启用了 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 中添加上述规则


0
投票
这似乎是一个老问题,但我会记录我的案例,因为它可能会帮助其他人:使用

Unity IAP @ 4.12.1

,我们的应用程序在初始化应用内购买模块后就开始崩溃。这是由于
Play Billing API
分布发生变化

例如:例如

.aar

 现在通过 gradle 依赖项注入

使用

Mujahid 的 awnsergradle

Vishal 的 proguard
 规则解决了我们的问题。

有用的笔记

    记得在同一版本中添加
  • coroutines-android
    coroutines-core
    
    
  • 最新使用的版本
  • Unity IAP
     
    4.12.0指的是PlayBilling 6.2.1
    ,取决于
    [email protected]
    来源
    
    
    
© www.soinside.com 2019 - 2024. All rights reserved.