2017-04-25 2 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를 사용하는

runOnUiThread(
     object : Runnable { 
      override fun run() { 
       Log.i(TAG, "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"); 
       } 
      }; 
     } 
    }); 

난 당신이 내부 코드가 실행되지 않는 방법을 볼 수 있기를 바랍니다 : 당신은 자바에서 오는 경우
, 여기에 코드에 해당하는 자바의 예입니다.

관련 문제