#android #kotlin #kotlin-coroutines
Вопрос:
Когда я открываю свое приложение, на некоторых устройствах происходит сбой при запуске, и оно сразу же исчезает на моем устройстве. Вот мой код для запуска активности:
CoroutineScope(Dispatchers.Main).launch { withContext(Dispatchers.IO) { dataStore.data.map { preferences -gt; preferences[DataStoreManager.NOT_FIRST_LUNCH] ?: false }.collect { notFirstLaunch -gt; 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 -gt; preferences[DataStoreManager.IS_NIGHT] ?: false }.collect { isNight -gt; withContext(Dispatchers.Main) { if (isNight) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) else AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) //todo gotoSplash() gotoMain() } } } } } } }
Комментарии:
1. Пожалуйста, опубликуйте журнал ошибок
2. После сбоя приложения описание ошибки должно появиться в окне Logcat, пожалуйста, вставьте его сюда.
3. Кстати, вам не нужно выполнять все эти переключения диспетчеров. Вы не вызываете никакого блокирующего кода. В этом коде вообще нет необходимости упоминать каких-либо диспетчеров. Затем он будет использовать значение по умолчанию Main для всего, чтобы это было безопасно.
4. вы уверены в этом? я использую хранилище данных Jetpack ! вы хотите сказать, что лучше удалить эти коды?
withContext(Dispatchers.IO) {
? @tenfour045. как я уже сказал, «он сразу исчезает на моем устройстве» и не имеет сбоя, но кто-то сказал мне, что он падает при первом открытии приложения(например, логика LaunchActivity) @RickyMo
Ответ №1:
Потратив на это немного времени, я понял, что когда я меняю логическое значение в:
editBoolean(DataStoreManager.NOT_FIRST_LUNCH
Хранилище данных немедленно изменяет его, и поток выдает новое значение, и до того, как пользователь выполнит условие пропуска, оно выполняется снова, и на этот раз с новым значением, и неправильное условие становится истинным(логически) .
Вместо этого я добавляю его в прослушиватель щелчков