Me encontré con una característica muy extraña.
Cuando intento ejecutar una animación en el hilo principal, no se inicia. Cuando ejecuto dicha animación usando
getView().post(new Runnable() {
@Override
public void run() {
getView().startAnimation(a);
}
});
Empieza.
Imprimí el CurrentThread
antes de comenzar la animación y ambos imprimieron main
.
Obviamente, me falta algo aquí, ya que ambos deberían iniciar la animación en el hilo principal ... Supongo que cuando la publicación agrega la tarea a la cola, comienza en un "momento correcto", pero me encantaría saber lo que sucede aquí con más profundidad.
EDITAR: Permítanme aclarar las cosas: mi pregunta es, por qué iniciar la animación en la publicación hace que se inicie, cuando no se inicia la animación en el hilo principal.
AnimationDrawable
! LaAnimation
instancia ordinaria comenzó a animarse con éxito en cada configuración. EnAnimationDrawable
caso; cuando intenta iniciarloonCreate
, no se inicia porque no está adjunto a la vista en ese momento. Por lo tanto, no es un problema de subprocesosAnimationDrawable
. ¿Quizás se aplica lo mismoAnimation
? developer.android.com/guide/topics/graphics/…Respuestas:
post : post hace que el Runnable se agregue a la cola de mensajes,
Ejecutable: representa un comando que se puede ejecutar. A menudo se usa para ejecutar código en un hilo diferente.
run () : comienza a ejecutar la parte activa del código de la clase. Este método se llama cuando se inicia un hilo que se ha creado con una clase que implementa Runnable.
codigo :
getView().startAnimation(a);
en tu código,
post hace que Runnable (el código se ejecutará en un hilo diferente) para agregar la cola de mensajes.
Por lo tanto, startAnimation se activará en un nuevo hilo cuando se obtenga del messageQueue
[EDITAR 1]
¿Por qué usamos un nuevo hilo en lugar del hilo de la interfaz de usuario (hilo principal)?
Hilo de la interfaz de usuario:
Cuando se inicia la aplicación, Ui Thread se crea automáticamente
está a cargo de enviar los eventos a los widgets apropiados y esto incluye los eventos de dibujo.
También es el hilo con el que interactúas con los widgets de Android.
¿Qué sucede si un usuario presiona un botón que hará una operación prolongada?
La interfaz de usuario se congela. El programa incluso puede fallar.
Rompe la regla de Android que nunca actualiza la interfaz de usuario directamente desde el hilo del trabajador
Android ofrece varias formas de acceder al hilo de la interfaz de usuario desde otros hilos.
Como abajo,
View.post (ejecutable)
Manipulador
Para más información
http://android-developers.blogspot.com/2009/05/painless-threading.html
http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/
fuente
¿Se está haciendo esto en onCreate o onCreateView? Si es así, es posible que la aplicación no esté en un estado en el que la Vista esté adjunta a la ventana. Es posible que muchos algoritmos basados en métricas de vista no funcionen, ya que es posible que no se hayan calculado cosas como las medidas y la posición de la vista. Las animaciones de Android generalmente requieren que se ejecuten a través de matemáticas de interfaz de usuario
View.post en realidad pone en cola la animación en el bucle de mensajes de la Vista, por lo que una vez que la vista se adjunta a la ventana, ejecuta la animación en lugar de hacer que se ejecute manualmente.
En realidad, está ejecutando cosas en el hilo de la interfaz de usuario, pero en un momento diferente
fuente
Eche un vistazo aquí para obtener una buena respuesta. view.post () es lo mismo que handler.post () prácticamente. Entra en la cola de subprocesos principal y se ejecuta después de que finalizan las otras tareas pendientes. Si llama a activity.runOnUiThread (), se llamará inmediatamente en el hilo de la interfaz de usuario.
fuente
Creo que el problema podría ser el método de ciclo de vida en el que está llamando al método post (). ¿Lo estás haciendo en onCreate ()? si es así, mire lo que encontré en la documentación de onResume () de la actividad:
https://developer.android.com/reference/android/app/Activity.html#onResume ()
Entonces, como dijo Joe Plante, tal vez la vista no esté lista para iniciar animaciones en el momento en que llama a post (), así que intente moverla a onResume ().
PD: En realidad, si mueve el código a onResume (), entonces creo que puede eliminar la llamada post () ya que ya está en el hilo de la interfaz de usuario y la vista debería estar lista para iniciar las animaciones.
fuente
onResume
se puede llamar varias veces (las pantallas se suspenden, la actividad se desplaza al backstack, etc.) después de que sea inicialmente cuando "la vista está lista". Si se llama desdeonResume
, es posible que se necesite una bandera para realizar un seguimiento del tiempo en que la animación ya se ha iniciado, para evitar (re) iniciar varias veces.