kotlin runOnUiThread未调用

vmjh9lq9  于 2023-05-01  发布在  Kotlin
关注(0)|答案(5)|浏览(125)
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不工作,但在该方法之外,一切都照常工作。

ngynwnxp

ngynwnxp1#

你正在做的是将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(
        object : Runnable {
            override fun run() {
                Log.i(TAG, "runOnUiThread")
            }
        }
)

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

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

下面是涵盖SAM转换的官方文档,它在示例中碰巧使用了Runnable

mxg2im7a

mxg2im7a2#

以上答案正确,应该接受。
如果你来自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");
                }
            };
        }
    });

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

68bkxrlz

68bkxrlz3#

基于Rx的答案:

import rx.Observable

Observable.just(true)
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe{
              // your code
           }
jgovgodb

jgovgodb4#

最好使用协程
尝试使用

runBlocking (Dispatchers.Main) {
   // any Main thread needs
}
syqv5f0l

syqv5f0l5#

// This is running on a coroutine thread
fun doSomeBackgroundWork() {
  // Perform some work in the background
  val result = performLongRunningOperation()

  // Get a reference to the main thread's Looper
  val mainLooper = Looper.getMainLooper()

  // Create a Handler to run some code on the UI thread
  val handler = Handler(mainLooper)
  handler.post {
    updateUi(result)
  }
}

相关问题