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"); } }; } });
我希望你能看到内部的代码不会被执行。