runOnUiThread no está llamando

localChatManager.addIncomingListener { from, message, chat -> Log.v(TAG,"listener") //You can't modify views from non-UI thread. this@chatActivity.runOnUiThread { object :Runnable{ override fun run() { Log.i(TAG,"runOnUiThread") } } } } 

No puedo descifrar por qué runOnUiThread no funciona, pero fuera de ese método todo funciona como siempre.

Lo que estás haciendo es pasar una lambda a la function runOnUiThread . Ejecutará ese lambda y creará un object que henetworkinga de Runnable y luego no hará nada con él. Tal vez pueda ver eso un poco mejor si lo formatea así (se agregaron algunas explicaciones y resúmenes adicionales):

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

El object creado no está asignado a una variable y nunca se usa. Si desea pasar una instancia de runOnUiThread método runOnUiThread , puede hacerlo simplemente poniéndolo entre paréntesis de la llamada runOnUiThread :

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

La forma más simple de usar runOnUiThread es pasarle una lambda usando conversión SAM, y escribir el código que desea ejecutar directamente dentro de eso.

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

Aquí está la documentation oficial que cubre las conversiones de SAM , que usa Runnable en sus ejemplos.

La respuesta anterior es correcta y debe ser aceptada.
En caso de que provenga de Java, aquí hay un ejemplo de Java equivalente a su código:

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

Espero que puedas ver cómo el código interno no se ejecuta.

  • Comportamiento inesperado con AWS Lambda
  • Async funcionando, pero obteniendo una reference no resuelta para esperar
  • ¿Puedo acceder al object "adjunto" para una llamada de function en línea en Kotlin?
  • Método abstracto de Kotlin con cuerpo
  • ¿Cuál es la diferencia al agregar un modificador privado a los arguments en un constructor de Kotlin?
  • ¿Cómo puedo verificar el tipo genérico en Kotlin?
  • Error de reference sin resolver en copyOfRange
  • ¿Cuál es la forma más rápida / más simple de calcular una media mobile en Kotlin?