web-dev-qa-db-fra.com

Android "Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues." Erreur dans la boucle

J'essaie d'exécuter la boucle for toutes les demi-secondes.La boucle change quelque chose dans la vue chaque fois qu'elle est appelée, mais les changements sont effectués par une autre classe, c'est-à-dire le compteur de vitesse.

Thread thread=new Thread(){
        @Override
        public void run() {
            float i;
            try {

                for ( i = 0; i <= 100; i++) {
                            Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8);
                            Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8);
                            Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8);
                            Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8);
                            Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8);
                            Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8);


                    sleep(500);
                }
            }
            catch (InterruptedException e)
            {e.printStackTrace();}
        }
    };thread.start();
16
Ariel

C'est parce que toute vue ne peut être modifiée que dans le thread principal ou le thread d'interface utilisateur. Essayez d'exécuter onSpeedChanged() en utilisant runOnUiThread(). Comme ça:

    Thread thread=new Thread(){
    @Override
    public void run() {
        float i;
        try {

            for ( i = 0; i <= 100; i++) {
                runOnUiThread(new Runnable() {
                    public void run() {
                        Speedometer1.onSpeedChanged(Speedometer1.getCurrentSpeed(i) + 8);
                        Speedometer2.onSpeedChanged(Speedometer2.getCurrentSpeed(i) + 8);
                        Speedometer3.onSpeedChanged(Speedometer3.getCurrentSpeed(i) + 8);
                        Speedometer4.onSpeedChanged(Speedometer4.getCurrentSpeed(i) + 8);
                        Speedometer5.onSpeedChanged(Speedometer5.getCurrentSpeed(i) + 8);
                        Speedometer6.onSpeedChanged(Speedometer6.getCurrentSpeed(i) + 8)

                    }

                });


                sleep(500);
            }
        }
        catch (InterruptedException e)
        {e.printStackTrace();}
    }
};thread.start();
17
Miguel Benitez

Vous devez mettre à jour les composants de l'interface utilisateur dans runOnUIThread. Un exemple de code est

runOnUiThread(new Runnable() {
     @Override
     public void run() {

       //stuff that updates ui

    }
});
9
Mujammil Ahamed

Vous devez mettre à jour votre interface utilisateur sur le thread d'interface utilisateur.

Pour cela, créez un gestionnaire dans votre méthode onCreate ():

private Handler mHandler;

@Override
public void onCreate() {
    mHandler = new Handler();
    // ...
}

Appelez ensuite le gestionnaire dans votre thread séparé pour l'exécuter sur le thread principal:

mHandler.post(new Runnable() {
    @Override
    public void run() {
        // Update your UI
    }
});
7
xdevs23

Vous ne pouvez pas modifier les objets View depuis l'extérieur du thread principal. Même si votre classe Speedometer apporte les modifications, elle s'exécute dans le thread secondaire que vous avez créé.

Vous pouvez créer un Runnable et publier avec deejay dans un Handler créé par le thread principal, ou utiliser d'autres techniques similaires pour accomplir la même chose.

0
Larry Schiefer