Kill Runnable process - PullRequest
       7

Kill Runnable process

0 голосов
/ 04 марта 2019

У меня есть функция простого таймера.Эта функция вызывается в OnCreate ().Когда я перехожу к другому занятию и возвращаюсь, мое действие с таймером воссоздается, и таймер начинает работать в 2 раза быстрее.

Я пытался убрать removeCallbacks из моего Runnable, но он не работает.

КакМогу ли я убить свой Runnable, чтобы предотвратить суммирование?

private fun onTimerStart(){
        ed.putBoolean("thread", true).apply()
        mRunnable = Runnable {
            seconds = sp.getLong("SECONDS",0)
            try {
                if (seconds!=0L){
                    startRun = true
                    btnStartEnd.text = getString(R.string.stop)
                }
            }catch (ex:Exception){}
            val hours = seconds/3600
            val minutes = (seconds%3600)/60
            val secs = (seconds%60)
            val time = String.format("%d:%02d:%02d", hours, minutes, secs)
            txtClock.text = time
            if (startRun){
                seconds++
                ed.putLong("SECONDS",seconds).apply()
            }
            mHandler.postDelayed(this,1000)
        }
        mHandler.postDelayed(mRunnable,1000)
    }

1 Ответ

0 голосов
/ 04 марта 2019

Ваш Runnable не уничтожен, потому что он запускается в обработчике после удаления.

var mIsStopped = false

private fun onTimerStart() {
    ed.putBoolean("thread", true).apply()
    mRunnable = Runnable {
        seconds = sp.getLong("SECONDS", 0)
        try {
            if (seconds != 0L) {
                startRun = true
                btnStartEnd.text = getString(R.string.stop)
            }
        } catch (ex: Exception) {
        }
        val hours = seconds / 3600
        val minutes = (seconds % 3600) / 60
        val secs = (seconds % 60)
        val time = String.format("%d:%02d:%02d", hours, minutes, secs)
        txtClock.text = time
        if (startRun) {
            seconds++
            ed.putLong("SECONDS", seconds).apply()
        }
        if (!mIsStopped) mHandler.postDelayed(this, 1000)
    }
    mHandler.postDelayed(mRunnable, 1000)
}

override fun onPause() {
    mHandler.removeCallbacksAndMessages(null);
    mIsStopped = true
}

override fun onResume() {
    mIsStopped = false
}
...