web-dev-qa-db-fra.com

Les animateurs ne peuvent être exécutés que sur les threads Looper Android

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!

23
Adrien Zier

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.

15
Guruprasad Rao

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. 

18
DeeV
runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Your code
            }
});

Vous devez exécuter le code dans le thread de l'interface utilisateur

11
Davide

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 
        }
    });
1
saigopi

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.

0
tuzhao