java - studio - Los animadores solo se pueden ejecutar en hilos de Looper Android
looper prepare thread (5)
Estoy tratando de animar algo cuando se completa una tarea. El problema aquí es que me sale este mensaje de error:
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)
La aplicación funcionó bien antes con el mismo código exacto, pero ahora simplemente no funciona. Estoy realmente confundido.
Aquí es donde ocurre el error:
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();
El error describe el método loading.animate()
.
¡Gracias por adelantado!
Creo que puede crear una instancia de controlador principal en su actividad y anular el método del mensaje de manejar. puede guardar una cotización de manejador en su hilo de trabajo. Cuando terminó el trabajo, puede usar el manejador para enviar un mensaje y recibe un mensaje en el método de manejo de mensajes. Para iniciar la animación desde el método de mensaje del controlador y así sucesivamente ...
Creo que, ha habido una solution para esto utilizando Handler
. Puede usar postDelayed
a mínimo como 100
y ejecutar sus tareas de animación. En tu caso sería:
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);
Tuve este problema hoy y por encima del trabajo resolví el problema. Me encantaría saber de alguien si hay algún problema con este método.
Poner código donde están obteniendo error y haciendo cualquier operación de red
new Handler().post(new Runnable() {
@Override
public void run() {
// add your code here
}
});
Los hilos de looper son hilos en Android que permanecen en bucle permanentemente (o hasta que los cancelas). Trabajan en conjunto con los Manejadores, los cuales publicarán y enviarán mensajes a los hilos de Looper
. Los animadores utilizan un uso intensivo de los hilos de Looper porque realizan sus acciones en ciclos repetidos. Esto permite que el animador no se bloquee después de presionar "Inicio" para que pueda continuar realizando otras acciones.
Para complicar aún más las cosas, lo más probable es que esté realizando animaciones en los objetos View
. Solo se pueden ejecutar en el subproceso de la interfaz de usuario principal (que es el subproceso Looper
más grande de todos). Por lo tanto, no puede ejecutar estas animaciones en subprocesos separados como lo está intentando.
runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code
}
});
Tienes que ejecutar el código en el hilo UI