2017-04-25 1 views
1
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が呼び出されていない

答えて

3

あなたがやっていることは、runOnUiThread関数にラムダを渡すことです。そのラムダを実行し、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が変数に割り当てられていない、そして使用されることはありません。

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

runOnUiThreadかかわらを使用する最も簡単な方法は、ラムダに渡すことです:あなたはrunOnUiThread方法にRunnableインスタンスに渡したい場合は、あなただけのrunOnUiThreadコールのかっこ内にそれを置くことによってそれを行うことができますSAM変換を使用して、その中で直接実行したいコードを記述します。

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

は、ここでその例でRunnableを使用するように起こるofficial documentation covering SAM conversions、です。

+1

恐ろしい解明。ありがとう@ zamb13 –

0

上記の回答は正しいので、受け入れてください。

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"); 
       } 
      }; 
     } 
    }); 

私はあなたが、内のコードが実行されませんどのように見ることができることを望む:あなたは、Javaから来ている場合は
、ここにあなたのコードの同等のJavaの例です。

関連する問題