处理程序的帖子在Kotlin不起作用,出了什么问题

son*_*610 7 android handler runnable kotlin

有人能告诉我什么是错的,我试着用一个Handler帖子Runnable但是它没有执行

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 }
}
Run Code Online (Sandbox Code Playgroud)

这是输出

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}

crg*_*dos 15

首先,不要使用!!运算符,这是一个非常糟糕的做法(来自doc).随着?你会到达相同的行为,但如果检查实例执行前变成了空.

这样说,使用:

mHandler?.post { runnable }
Run Code Online (Sandbox Code Playgroud)

您实际上正在创建一个包含可运行行的新lambda.请以更易读的方式在下面看到:

mHandler?.post { 
   runnable 
}
Run Code Online (Sandbox Code Playgroud)

这在Java中是等价的:

mHandler.post(new Runnable(){
    public void run(){
        runnable;
    }
});
Run Code Online (Sandbox Code Playgroud)

要解决这个问题:

选项1:摆脱可运行的声明

mHandler?.post { /*the content of your runnable*/ }
Run Code Online (Sandbox Code Playgroud)

选项2:使用runnable实例

mHandler?.post(runnable) // normal parentheses
Run Code Online (Sandbox Code Playgroud)

选项3:疯狂的方式

mHandler?.post { runnable.run() }
Run Code Online (Sandbox Code Playgroud)