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无法正常工作,但在该方法之外,一切正常。
答案 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
}