localChatManager.addIncomingListener { from, message, chat ->
Log.v(TAG,"listener")
//You can't modify views from non-UI thread.
[email protected] { object :Runnable{
override fun run() {
Log.i(TAG,"runOnUiThread")
}
} }
}
RunOnUiThreadが機能していない理由を理解することはできませんが、そのメソッド以外ではすべてが通常どおり機能しています。
あなたがしていることは、ラムダをrunOnUiThread
関数に渡すことです。それはそのラムダを実行し、object
から継承する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(
object : Runnable {
override fun run() {
Log.i(TAG, "runOnUiThread")
}
}
)
ただし、runOnUiThreadを使用する最も簡単な方法は、SAM変換を使用してラムダにラムダを渡し、その中で直接実行するコードを記述することです。
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");
}
};
}
});
内部コードが実行されない様子をご覧いただければ幸いです。
Rxベースの回答:
import rx.Observable
Observable.just(true)
.observeOn(AndroidSchedulers.mainThread())
.subscribe{
// your code
}