runOnUiThread没有调用

时间:2017-04-25 17:31:56

标签: 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")
                     }
                } }
            }

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

4 个答案:

答案 0 :(得分:10)

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

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") }) 未分配给变量,并且从未使用过。如果您想将object实例传递给Runnable方法,只需将其放在runOnUiThread调用的括号内即可:

runOnUiThread

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

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

这里是official documentation covering SAM conversions,恰好在其示例中使用了runOnUiThread { Log.i(TAG, "runOnUiThread") }

答案 1 :(得分:1)

基于接收的答案:

import rx.Observable

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

答案 2 :(得分:0)

上述答案是正确的,应予以接受 如果您来自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");
                }
            };
        }
    });

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

答案 3 :(得分:0)

最好使用协程

尝试使用

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