runOnUiThread没有调用

localChatManager.addIncomingListener { from, message, chat -> Log.v(TAG,"listener") //You can't modify views from non-UI thread. this@chatActivity.runOnUiThread { object :Runnable{ override fun run() { Log.i(TAG,"runOnUiThread") } } } } 

我无法弄清楚为什么runOnUiThread不工作,但在这种方法之外,一切正常。

你正在做的是将lambda传递给runOnUiThread函数。 它将运行该lambda,并创建一个从Runnable继承的object ,然后不做任何事情。 也许你可以看到,如果你这样格式化一点点(增加了一些额外的日志语句和解释):

 runOnUiThread({ Log.i(TAG, "This is run") object : Runnable { // This whole expression override fun run() { // returns an object which Log.i(TAG, "runOnUiThread") // is a Runnable, but does } // not at any point invoke } // its "run" method Log.i(TAG, "And so is this") }) 

创建的object不会被分配给变量,也不会被使用。 如果要将Runnable实例传递给runOnUiThread方法,只需将其放入runOnUiThread调用的括号runOnUiThread

 runOnUiThread( object : Runnable { override fun run() { Log.i(TAG, "runOnUiThread") } } ) 

尽管使用runOnUiThread最简单的方法是使用SAM转换将lambda传递给它,然后直接在其中写入要执行的代码。

 runOnUiThread { Log.i(TAG, "runOnUiThread") } 

这里是关于SAM转换的官方文档 ,它恰好在其示例中使用了Runnable

上述答案是正确的,应该被接受。
如果你来自Java,下面是你的代码的等效Java的一个例子:

  runOnUiThread(new Runnable() { // This runnable is created @Override // from lambda by SAM convention public void run() { new Runnable() { // This Runnable is instantiated @Override // inside the lambda but never runs. public void run() { Log.i(TAG, "runOnUiThread"); } }; } }); 

我希望你能看到内部的代码不会被执行。