web-dev-qa-db-fra.com

runOnUiThread n'appelle pas

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.

4
Ankur Khandelwal

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.

6
zsmb13

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é.

0
RobCo