主调度程序的模块丢失

时间:2018-10-06 09:31:52

标签: android kotlin coroutine 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())
            }
        })
    }
}

我的问题是出现运行时异常:

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'

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

10 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:5)

同时使用Core和Android依赖

Type: AWS::Serverless::Function
    Properties:
       Events:
         ProxyResource:
           Type: Api
           Properties:
             RestApiId: ...
             Path: /{proxy+}
             Method: ANY
         RootResource:
           Type: Api
           Properties:
             RestApiId: ...
             Path: /
             Method: ANY

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

./gradlew assembleDebug --rerun-tasks

如果上述答案对您不起作用(因为您已经具有必需的依赖性,并且您正在使用不需要proguard规则的R8)进行了修复。

答案 5 :(得分:3)

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

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

答案 6 :(得分:1)

如果有人从上面尝试解决方案而行不通,这只是一个附加提示。

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

答案 7 :(得分:1)

好吧,在我看来, var outer = { outervalue: 3, inner: { innerFunc: function () { // How can I get access to outer_value inside this method return (this.outervalue); }.call(outer) } }; 是造成此问题的原因。但是要实现这种模糊处理,我必须将minifyEnabled true保留在发行版中。所以我做了以下更改。

minifyEnabled true

在您的proguard-rules.pro中添加

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

我还需要在proguard-rules.pro

中添加用于通过翻新进行API调用的模型类
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory {*;}

答案 8 :(得分:0)

尝试cleanrebuild项目。 如果没有用,请尝试:

File -> invalidate Caches / Restart...

答案 9 :(得分:0)

我已经通过将两个版本相同来解决了 “ 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