web-dev-qa-db-ja.com

runOnUiThreadが呼び出していません

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が機能していない理由を理解することはできませんが、そのメソッド以外ではすべてが通常どおり機能しています。

8

あなたがしていることは、ラムダを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を使用しています。

17
zsmb13

上記の答えは正解であり、受け入れられるべきです。
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");
                }
            };
        }
    });

内部コードが実行されない様子をご覧いただければ幸いです。

1
RobCo

Rxベースの回答:

  import rx.Observable

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