Задать вопрос
@I_suss

Почему счетчик на корутине работает не корректно?

есть вот такой код с карутиной с прибавлением к счетчику единицы и с задержкой в 5 секунд
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Coroutine()
    }

    private fun Coroutine(){
        var count = 0
        val textView : TextView = findViewById(R.id.CountText)

        val scope = CoroutineScope(Dispatchers.Main)

        scope.launch {
            while (true){
                count++
                textView.text = count.toString()
                delay(5000)
            }
        }
    }

все работает стабильно до числа 5, потом начинается вакханалия, от счетчика сначала отнимается 1, потом прибавляется сразу 2, потому цифры две все работает нормально и снова данная проблема, и так это все продолжается с переменным успехом.
С чем это связанно ? почему это так ? проблема в коде или android studio, а может вообще в ПК или в чем то ином ? я пробовал использовать CountDownTimer, аналогичная проблема.
Код запускается на эмуляторе.
  • Вопрос задан
  • 87 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Ну... если проводить аналогию с потоками. То count будет иметь столько экземпляров сколько
корутин запущено. Тоесть счетчик локальный по отношениию к функции.

И поскольку textView - это глобальный объект. Его видят все функции то они начинают его бомбить
разными значениями.
Ответ написан
Jacen11
@Jacen11
у меня вот такая реализация, не помню где брал

private var timerJob: Job? = null

fun showTimer(){

   val isCanSendActionTyping = timerJob?.isCompleted == true || timerJob== null
   var time = 0
  if (isCanSendActionTyping) {
            timerJob= lifecycleScope.launchSafe(start = CoroutineStart.LAZY) {
                while (true) {
                    textView.text = time.toString()
                    time++
                    delay(5000)
                }
            }
            timerJob?.start()
        }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы