webentwicklung-frage-antwort-db.com.de

Animatoren dürfen nur auf Looper-Threads Android ausgeführt werden

Ich versuche, etwas zu animieren, wenn eine Aufgabe abgeschlossen ist. Das Problem hier ist, dass ich diese Fehlermeldung bekomme: 

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)

Die App hat zuvor mit dem gleichen exakten Code funktioniert, jetzt aber einfach nicht. Ich bin wirklich verwirrt.

Hier passiert der Fehler:

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

Der Fehler beschreibt die loading.animate()-Methode.

Danke im Voraus!

23
Adrien Zier

Ich denke, es gab eine Lösung für diese Verwendung von Handler. Sie können postDelayed verwenden, um als 100 zu minimieren und Ihre Animationsaufgaben auszuführen. In Ihrem Fall wäre das:

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);

Ich hatte dieses Problem heute und die Arbeit löste das Problem. Ich würde gerne von jemandem hören, wenn es Probleme mit dieser Methode gibt.

15
Guruprasad Rao

Looper-Threads sind Threads in Android, die permanent eine Schleife durchlaufen (oder bis Sie sie abbrechen). Sie arbeiten mit Handlers zusammen, die Nachrichten an Looper-Threads senden und senden. Animatoren verwenden häufig Looper-Threads, da sie ihre Aktionen in wiederholten Zyklen ausführen. Dadurch kann der Animator nicht blockieren, nachdem Sie "Start" gedrückt haben, sodass Sie weitere Aktionen ausführen können.

Um die Sache noch komplizierter zu gestalten, führen Sie höchstwahrscheinlich Animationen für View-Objekte aus. Diese können nur auf dem Haupt-UI-Thread ausgeführt werden (was der größte Looper-Thread von allen ist). Sie können diese Animationen also nicht auf separaten Threads ausführen, wie Sie es versuchen. 

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

Sie müssen den Code im UI-Thread ausführen

11
Davide

Code eingeben, wo Fehler auftreten und Netzwerkvorgänge ausführen 

new Handler().post(new Runnable() {
        @Override
        public void run() {
            // add your code here 
        }
    });
1
saigopi

Ich denke, Sie können eine Main-Handler-Instanz in Ihrer Aktivität erstellen und die Handle-Message-Methode überschreiben. Sie können ein Handler-Zitat in Ihrem Arbeitsthread speichern. Wenn Sie die Arbeit beendet haben, können Sie mit dem Handler eine Nachricht senden, und Sie erhalten eine Nachricht in der Handle-Message-Methode. So starten Sie die Animation von der Handler-Nachrichtenmethode usw.

0
tuzhao