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!
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.
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.
runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code
}
});
Sie müssen den Code im UI-Thread ausführen
Code eingeben, wo Fehler auftreten und Netzwerkvorgänge ausführen
new Handler().post(new Runnable() {
@Override
public void run() {
// add your code here
}
});
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.