Search code examples
androidkotlinhandlerrunnable

Handler post is not working in Kotlin Android


Could someone show me what is wrong?

I try to use a Handler post a Runnable but it's not execute

var mHandler: Handler? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    mHandler = Handler()
    var runnable = Runnable {
        Log.d("TEST", "++++ runable")
        Log.d("TEST", "++++ come end")
    }
    Log.d("TEST", "++++ runnable" + runnable)
    Log.d("TEST", "++++ handle" + mHandler)
    mHandler!!.post { runnable }
}

This is output

09-21 00:56:04.067 4419-4419/? D/TEST: ++++ runnablecom.vpioneer.activity.MainActivity$onCreate$runnable$1@529b8fb4 09-21 00:56:04.067 4419-4419/? D/TEST: ++++ handleHandler (android.os.Handler) {529b8cb4}


Solution

  • First at all, don't use !! operator, it is a very bad practice (from the doc). With ? you will reach the same behaviour but checking if the instance became null before executing it.

    Saying this, using:

    mHandler?.post { runnable }
    

    You are actually creating a new lambda containing runnable line. see here below in a more readable way:

    mHandler?.post { 
       runnable 
    }
    

    This is the equivalent in Java:

    mHandler.post(new Runnable(){
        public void run(){
            runnable;
        }
    });
    

    To solve this:

    Option 1: getting rid of the runnable declaration

    mHandler?.post { /*the content of your runnable*/ }
    

    Option 2: using your runnable instance

    mHandler?.post(runnable) // normal parentheses
    

    Option 3: crazy way

    mHandler?.post { runnable.run() }