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();
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();
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
}
});
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
}
});
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.