Handler to run task every 5 seconds Kotlin

I recommended SingleThread because it is very useful. If you would like to do job for each second, you can set because parameters of it:

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

TimeUnit values are: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS.

Example:

private fun mDoThisJob(){

    Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
        //TODO: You can write your periodical job here..!

    }, 1, 1, TimeUnit.SECONDS)
}

Simply Use fixedRateTimer

 fixedRateTimer("timer",false,0,5000){
        [email protected] {
            Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
        }
    }

Change initial delay by setting another value for the third parameter.


Since you can't reference a lambda you're currently in, and you can't reference the property you're defining while you're defining the lambda you're assigning to it, the best solution here is an object expression:

val runnableCode = object: Runnable {
    override fun run() {
        handler.postDelayed(this, 5000)
    }
}

Assuming that this property is not a var because you actually want to change it while this self-calling is happening.


As Kotlin does not yet allow recursive lambdas (see KT-10350), you must use other constructs, such as object expressions as in @zsmb13's answer, or ordinary functions as below

fun StartTimer() {
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}

fun runnable() {
    //Code here

    // Run code again after 5 seconds
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}

However, in your particular case, it looks like you could just call StartTimer() again to re-arm the timer, assuming it doesn't do anything else:

private val RunnableCode = Runnable {
    //Code here

    //Run code again after 5 seconds
    StartTimer()
}