Сопрограммы Android Kotlin работают не так, как я ожидал

#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) { ? @tenfour04

5. как я уже сказал, «он сразу исчезает на моем устройстве» и не имеет сбоя, но кто-то сказал мне, что он падает при первом открытии приложения(например, логика LaunchActivity) @RickyMo

Ответ №1:

Потратив на это немного времени, я понял, что когда я меняю логическое значение в:

editBoolean(DataStoreManager.NOT_FIRST_LUNCH Хранилище данных немедленно изменяет его, и поток выдает новое значение, и до того, как пользователь выполнит условие пропуска, оно выполняется снова, и на этот раз с новым значением, и неправильное условие становится истинным(логически) .

Вместо этого я добавляю его в прослушиватель щелчков