I would like to run a certain code every 5 seconds. I am having trouble achieving this with a handler. How can this be done in Kotlin? Here is what I have so far. Also to note, the variable Timer_Preview is a Handler.
This example demonstrates how do I run a method every 10 seconds in android. Step 1 − Create a new project in Android Studio, go to File ⇒ New Project and fill all required details to create a new project. Step 2 − Add the following code to res/layout/activity_main. xml.
The postDelayed method takes two parameters Runnable and delayMillis . It adds the Runnable to the thread's message queue to be run after the specified amount of time elapses. The Runnable will execute on the thread to which this handler is attached.
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.
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.
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)
}
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()
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With