Handler的post在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 } } 

这是输出

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}

首先,不要使用!! 操作员,这是一个非常糟糕的做法(从文档 )。 用? 你将达到相同的行为,但在执行之前检查实例是否为空。

说这个,使用:

 mHandler?.post { runnable } 

实际上你正在创建一个新的包含可运行行的lambdaexpression式。 在下面以更可读的方式看到这里:

 mHandler?.post { runnable } 

这在Java中是相当的:

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

要解决这个问题:

方案1:摆脱可运行的声明

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

选项2:使用您的可运行实例

 mHandler?.post(runnable) // normal parentheses 

选项3:疯狂的方式

 mHandler?.post { runnable.run() } 

你没有启动runnbale 。 尝试这个:

 mHandler!!.post { runnable.run() } 

这也是有效的:

 mHandler!!.post { Log.d("TEST", "++++ runable") Log.d("TEST", "++++ come end") }