J'essaie d'animer quelque chose lorsqu'une tâche est terminée. Le problème ici est que je reçois ce message d'erreur:
Android.util.AndroidRuntimeException: Animators may only be run on Looper threads
at Android.animation.ValueAnimator.cancel(ValueAnimator.Java:1004)
at Android.view.ViewPropertyAnimator.animatePropertyBy(ViewPropertyAnimator.Java:965)
at Android.view.ViewPropertyAnimator.animateProperty(ViewPropertyAnimator.Java:921)
at Android.view.ViewPropertyAnimator.alpha(ViewPropertyAnimator.Java:735)
at com.design.zaton.prototypei.MainActivity$1$1.run(MainActivity.Java:93)
at Java.lang.Thread.run(Thread.Java:761)
L'application fonctionnait bien auparavant avec le même code exact, mais maintenant elle ne fonctionne tout simplement pas. Je suis vraiment confus.
Voici où l'erreur se produit:
new Thread(new Runnable() {
@Override
public void run() {
final String s = getGiphyViews(String.valueOf(mEdit.getText()));
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText(s);
}
});
loading.animate()
.alpha(0)
.setDuration(100);
done.animate()
.scaleY(1)
.scaleX(1)
.setDuration(300);
}
}).start();
L'erreur décrit la méthode loading.animate()
.
Merci d'avance!
Je pense qu’il ya eu une solution pour utiliser Handler
. Vous pouvez utiliser postDelayed
à minimal en tant que 100
et exécuter vos tâches d’animation. Dans votre cas ce serait:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
final String s = getGiphyViews(String.valueOf(mEdit.getText()));
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText(s);
}
});
loading.animate()
.alpha(0)
.setDuration(100);
done.animate()
.scaleY(1)
.scaleX(1)
.setDuration(300);
}
}, 100);
J'ai eu ce problème aujourd'hui et le travail ci-dessus a résolu le problème. J'aimerais entendre n'importe qui s'il y a un problème avec cette méthode.
Les threads de Looper sont des threads sous Android qui bouclent en permanence (ou jusqu'à ce que vous les annuliez). Ils fonctionnent en conjonction avec Handlers , qui publieront et enverront des messages aux threads Looper
. Les animateurs utilisent beaucoup de threads Looper car ils effectuent leurs actions selon des cycles répétés. Cela permet à l'animateur de ne pas bloquer après que vous avez appuyé sur "Démarrer" afin que vous puissiez continuer à effectuer d'autres actions.
Pour compliquer davantage les choses, vous réalisez probablement des animations sur des objets View
. Ceux-ci ne peuvent être exécutés que sur le thread principal de l'interface utilisateur (qui est le plus gros thread Looper
de tous). Donc, vous ne pouvez pas exécuter ces animations sur des threads séparés, comme vous essayez.
runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code
}
});
Vous devez exécuter le code dans le thread de l'interface utilisateur
Placez le code là où sont des erreurs et des opérations sur le réseau
new Handler().post(new Runnable() {
@Override
public void run() {
// add your code here
}
});
Je pense que vous pouvez créer une instance de gestionnaire principal dans votre activité et remplacer la méthode du message de traitement. vous pouvez enregistrer une citation de gestionnaire dans votre fil de travail. Une fois votre travail terminé, vous pouvez utiliser le gestionnaire pour envoyer un message et vous recevez un message dans la méthode de traitement du message. Pour démarrer l'animation à partir de la méthode du message du gestionnaire, etc.