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.

  • @ Clase enterrable con val en Kotlin
  • ¿Está convirtiendo un file Kotlin a java, agregando código java a él y convirtiéndolo de nuevo a Kotlin igual que agregar código directamente al file Kotlin?
  • ¿Qué significa .indices en kotlin?
  • Tipos de datos algebraicos en Kotlin
  • Android Studio 3 no puede build fragments de kotlin
  • Agregar Kotlin al proyecto de Java existente rompe los errores gradle de Android Studio
  • Delegación de propiedad horneada por map mutable
  • Usar la function Reemplazar en KOTLIN
  • Guice MapBinder
  • No se puede ejecutar el proyecto de Kotlin en Android Studio 3.0
  • Kotlin: Pase el object en function como reference y cambie su instancia