Kotlin Timer () вероятно неправильная реализация - PullRequest
1 голос
/ 04 августа 2020

Я изучаю Kotlin и в то же время пытаюсь написать простое приложение. На самом деле, у меня проблема с Timer(), потому что, когда я включаю switch1, приложение вылетает во второй раз и пишет:

Timer is already cancelled.

Мне нужно остановить таймер, когда switch1 срабатывает и когда switch1 идет снова включен, таймер должен начать отсчет сначала. Возможно, мне придется реализовать это по-другому, но я не знаю, как это сделать.

Пожалуйста, помогите и прошу прощения за мой Engli sh.

import android.graphics.Color
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)

         val timer = Timer()

         switch1.setOnCheckedChangeListener { switch1, isChecked ->
             if (isChecked) {
                 root_layout.setBackgroundColor(Color.GREEN)

                 timer.schedule(object : TimerTask() {
                     override fun run() {
                         println("dfvffv")
                     } }, 2000, 2000)
             } else {
                 root_layout.setBackgroundColor(Color.LTGRAY)

                 timer.cancel()
             }
         }
     }
 }

1 Ответ

2 голосов
/ 04 августа 2020

Пытаться инициализировать timer каждый раз, когда пользователь нажимает переключатель:

var timer: Timer? = null

switch1.setOnCheckedChangeListener { switch1, isChecked ->
   
    if (isChecked) {
        timer = Timer()
        root_layout.setBackgroundColor(Color.GREEN)

        timer.schedule(object : TimerTask() {
            override fun run() {
                println("dfvffv")
            } }, 2000, 2000)
    } else {
        root_layout.setBackgroundColor(Color.LTGRAY)

        timer?.cancel()

    }
}

По описанию cancel() метода:

После завершения таймера его поток выполнения завершается корректно, и никакие другие задачи не могут быть запланированы для него.

Итак, вам нужно создать новый экземпляр Timer, чтобы запланировать новую задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...