【问题标题】:Android Kotlin coroutines not working as I expectedAndroid Kotlin 协程没有像我预期的那样工作
【发布时间】:2021-12-13 11:09:08
【问题描述】:

当我打开我的应用时,启动 Activity 在某些设备上崩溃,并且它立即在我的设备上消失。 这是我的launchActivity代码:

CoroutineScope(Dispatchers.Main).launch {
        withContext(Dispatchers.IO) {
            dataStore.data.map { preferences ->
                preferences[DataStoreManager.NOT_FIRST_LUNCH] ?: false
            }.collect { notFirstLaunch ->
                if (!notFirstLaunch) {
                    editBoolean(DataStoreManager.NOT_FIRST_LUNCH, true)
                    withContext(Dispatchers.Main) {
                        activityFullscreenCompat()
                        setContentView(R.layout.activity_lunch)
                        prepareIntro()
                        lunch_btn_skip.setOnClickListener { //todo gotoSplash()
                            gotoMain()
                        }
                    }
                } else {
                    withContext(Dispatchers.IO) {
                        dataStore.data.map { preferences ->
                            preferences[DataStoreManager.IS_NIGHT] ?: false
                        }.collect { isNight ->
                            withContext(Dispatchers.Main) {
                                if (isNight)
                                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
                                else
                                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
                                //todo gotoSplash()
                                gotoMain()
                            }
                        }
                    }
                }
            }
        }
    }

【问题讨论】:

  • 请贴出错误日志
  • 应用程序崩溃后,Logcat窗口会出现错误描述,请在此处粘贴。
  • 顺便说一句,您不需要执行所有调度程序切换。你没有调用任何阻塞代码。在这段代码中根本不需要提及任何调度程序。然后它将对所有内容使用默认的 Main 以确保安全。
  • 你确定吗?我正在使用 Jetpack 数据存储!您是说最好删除此代码? withContext(Dispatchers.IO) { ? @tenfour04
  • 正如我所说的“它会立即在我的设备上消失”并且没有崩溃,但有人对我说它在我第一次打开应用程序时崩溃(就像 launchActivity 的逻辑)@RickyMo

标签: android kotlin kotlin-coroutines


【解决方案1】:

花了一点时间后,我不明白当我改变布尔值时:

editBoolean(DataStoreManager.NOT_FIRST_LUNCH DataStore 立即更改它并流发出新值,在用户点击跳过条件之前再次运行,这次新值和错误条件变为真(逻辑上)。

相反,我将它添加到点击监听器

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2013-04-11
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 2014-06-28
    • 2020-08-24
    相关资源
    最近更新 更多