Ответ 1
Использование только версии kotlinx-coroutines-android решает проблему.
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.1'
Я пытаюсь сделать фоновый вызов для моей локальной базы данных и обновить пользовательский интерфейс с результатами, используя сопрограммы. Вот мой код:
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'
Я немного новичок в этом, может кто-нибудь мне помочь?
Использование только версии 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, который не нуждается в правилах proguard).
Попробуйте clean
проект и rebuild
.
если не сработало, попробуйте:
File -> invalidate Caches / Restart...