runOnUiThread没有调用

Ank*_*wal 7 android kotlin android-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")
                     }
                } }
            }
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么runOnUiThread不工作但在该方法之外一切正常.

zsm*_*b13 14

你正在做的是将lambda传递给runOnUiThread函数.它将运行该lambda,并创建一个object继承自的lambda,Runnable然后对其执行任何操作.如果您像这样格式化它可能会看到更好一些(添加一些额外的日志语句和解释):

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

创建object的未分配给变量,从不使用.如果要将Runnable实例传递给runOnUiThread方法,可以通过将其放在runOnUiThread调用的括号中来实现:

runOnUiThread(
        object : Runnable {
            override fun run() {
                Log.i(TAG, "runOnUiThread")
            }
        }
)
Run Code Online (Sandbox Code Playgroud)

使用runOnUiThread的最简单方法是使用SAM转换将lambda传递给它,并将要直接执行的代码写入其中.

runOnUiThread { 
    Log.i(TAG, "runOnUiThread") 
}
Run Code Online (Sandbox Code Playgroud)

这是涵盖SAM转换官方文档,恰好Runnable在其示例中使用.