2017-04-25 142 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

你正在做的是將lambda傳遞給runOnUiThread函數。它將運行該lambda,並創建一個從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沒有分配給一個變量,並且從未使用過。如果你想在一個Runnable實例的runOnUiThread方法傳遞,你可以做到這一點的只是把它的runOnUiThread調用的括號內:

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

到雖然使用runOnUiThread最簡單的方法是在一個lambda傳遞使用SAM轉換,並直接在其中寫入要執行的代碼。

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

這裏的official documentation covering SAM conversions,這恰好用在它的例子Runnable

+1

真棒澄清。謝謝@ zamb13 –

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

我希望你能看到內部的代碼沒有得到執行。