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")
}
} }
}
Je ne suis pas en mesure de comprendre pourquoi runOnUiThread ne fonctionne pas, mais en dehors de cette méthode, tout fonctionne comme d'habitude.
Ce que vous faites est de passer d'un lambda à la fonction runOnUiThread
. Il exécutera ce lambda et créera une object
qui héritera de Runnable
, puis ne fera rien avec. Peut-être pourrez-vous le voir un peu mieux si vous le formatez comme ceci (en ajoutant des instructions de journal supplémentaires et une explication):
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")
})
La object
créée n'est affectée à aucune variable et n'est jamais utilisée. Si vous souhaitez transmettre une instance Runnable
à la méthode runOnUiThread
, vous pouvez le faire en la plaçant simplement entre les parenthèses de l'appel runOnUiThread
:
runOnUiThread(
object : Runnable {
override fun run() {
Log.i(TAG, "runOnUiThread")
}
}
)
Le moyen le plus simple d'utiliser runOnUiThread consiste toutefois à lui transmettre un lambda à l'aide de la conversion SAM et à écrire le code que vous souhaitez exécuter directement à l'intérieur de celui-ci.
runOnUiThread {
Log.i(TAG, "runOnUiThread")
}
Voici la documentation officielle sur les conversions SAM , qui utilise Runnable
dans ses exemples.
La réponse ci-dessus est correcte et devrait être acceptée.
Si vous venez de Java, voici un exemple d’équivalent Java de votre code:
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");
}
};
}
});
J'espère que vous pouvez voir comment le code interne n'est pas exécuté.