Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert indefinitely running Runnable from java to kotlin

I have some code like this in java that monitors a certain file:

private Handler mHandler = new Handler();
private final Runnable monitor = new Runnable() {

    public void run() {
        // Do my stuff
        mHandler.postDelayed(monitor, 1000); // 1 second
    }
};

This is my kotlin code:

private val mHandler = Handler()
val monitor: Runnable = Runnable {
    // do my stuff
    mHandler.postDelayed(whatToDoHere, 1000) // 1 second
}

I dont understand what Runnable I should pass into mHandler.postDelayed. What is the right solution? Another interesting thing is that the kotlin to java convertor freezes when I feed this code.

like image 551
Binoy Babu Avatar asked Jun 27 '17 20:06

Binoy Babu


4 Answers

Lambda-expressions do not have this, but object expressions (anonymous classes) do.

object : Runnable {
    override fun run() {
        handler.postDelayed(this, 1000)
    }
}
like image 86
Miha_x64 Avatar answered Oct 17 '22 07:10

Miha_x64


A slightly different approach which may be more readable

val timer = Timer()
val monitor = object : TimerTask() {
    override fun run() {
        // whatever you need to do every second
    }
}

timer.schedule(monitor, 1000, 1000)

From: Repeat an action every 2 seconds in java

like image 34
Hobo Joe Avatar answered Oct 17 '22 07:10

Hobo Joe


Lambda-expressions do not have this, but object expressions (anonymous classes) do. Then the corrected code would be:

private val mHandler = Handler()
val monitor: Runnable = object : Runnable{
 override fun run() {
                   //any action
                }
                //runnable

            }

 mHandler.postDelayed(monitor, 1000)
like image 2
taranjeetsapra Avatar answered Oct 17 '22 09:10

taranjeetsapra


runnable display Toast Message "Hello World every 4 seconds

//Inside a class main activity

    val handler: Handler = Handler()
    val run = object : Runnable {
       override fun run() {
           val message: String = "Hello World" // your message
           handler.postDelayed(this, 4000)// 4 seconds
           Toast.makeText(this@MainActivity,message,Toast.LENGTH_SHORT).show() // toast method
       }

   }
    handler.post(run)
}
like image 1
KaZaiya Avatar answered Oct 17 '22 07:10

KaZaiya