android - programacion - ¿Qué hace exactamente el método de publicación?
manual de android en pdf (4)
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
CurrentThread
el CurrentThread
antes de comenzar la animación y ambos imprimí el main
.
Obviamente, me falta algo aquí, ya que ambos deberían comenzar la animación en el hilo principal ... Supongo que a medida que la publicación agrega la tarea a la cola, comienza en un "momento más correcto", pero me encantaría saber qué pasa aquí más a fondo
EDITAR: Déjenme aclarar las cosas - mi pregunta es, ¿por qué comenzar la animación en la publicación hace que comience, al iniciar la animación en el hilo principal no lo hace.
¿Se está haciendo esto en onCreate o onCreateView? Si es así, es posible que la aplicación no esté en un estado donde la Vista esté conectada a la ventana. Es posible que muchos algoritmos basados en las métricas de View no funcionen, ya que es posible que no se hayan calculado cosas como las mediciones y la posición de la Vista. Las animaciones de Android normalmente requieren que se ejecuten a través de la UI de matemáticas
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 ejecutarla manualmente.
En realidad está ejecutando cosas en el hilo de la interfaz de usuario, pero en un momento diferente
Echa un vistazo here para una buena respuesta. view.post () es lo mismo que handler.post (). Va a la cola de subprocesos principal y se ejecuta después de que las otras tareas pendientes hayan finalizado. Si llama a activity.runOnUiThread () se llamará inmediatamente en el subproceso de la interfaz de usuario.
El problema creo que podría ser el método del ciclo de vida en el que llamas al método post (). ¿Lo estás haciendo en onCreate ()? de ser así, mira lo que encontré en la documentación onResume () de la actividad:
En resumen()
Agregado en API nivel 1 void onResume () Llamado después de RestoreInstanceState (Bundle), onRestart () o onPause (), para que su actividad comience a interactuar con el usuario. Este es un buen lugar para comenzar animaciones , abrir dispositivos de acceso exclusivo (como la cámara), etc.
https://developer.android.com/reference/android/app/Activity.html#onResume()
Entonces, como dijo Joe Plante, tal vez la vista no esté lista para comenzar las animaciones en el momento en que llamas a post (), así que intenta moverlo a onResume ().
PD: En realidad, si mueves el código a onResume (), entonces creo que puedes eliminar la llamada a post () ya que estás en el hilo de la interfaz de usuario y la vista debería estar lista para comenzar las animaciones.
publicación : publicación hace que Runnable se agregue a la cola de mensajes,
Runnable: representa un comando que se puede ejecutar. A menudo se usa para ejecutar código en un subproceso diferente.
run () : comienza a ejecutar la parte activa del código de la clase. Se llama a este método cuando se inicia un subproceso que se ha creado con una clase que implementa Runnable.
getView().**post**(new **Runnable**() {
@Override
public void run() {
getView().startAnimation(a);
}
});
código : getView().startAnimation(a);
en tu código,
la publicación causa Runnable (el código se ejecutará en una secuencia diferente) para agregar la cola de mensajes.
Entonces startAnimation se activará en un nuevo hilo cuando se extraiga del mensajeQueue
[EDIT 1]
¿Por qué usamos un nuevo hilo en lugar de un hilo UI (hilo principal)?
UI Thread:
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úa con los widgets de Android con
Por ejemplo, si toca el botón a en la pantalla, el subproceso de interfaz de usuario distribuye el evento táctil al widget, que a su vez establece su estado presionado y envía una solicitud de invalidación a la cola de eventos. El subproceso de interfaz de usuario dequeues la solicitud y notifica al widget para redibujarse.
¿Qué sucede si un usuario presiona un botón que hará longOperation?
((Button)findViewById(R.id.Button1)).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
});
La UI se congela. El programa puede incluso bloquearse.
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}
Se rompe la regla de Android que nunca actualiza la interfaz de usuario directamente desde el hilo de trabajo
Android ofrece varias formas de acceder al hilo de UI desde otros hilos.
- Activity.runOnUiThread (ejecutable)
- View.post (Runnable)
- View.postDelayed (Runnable, long)
- Entrenador de animales
Como abajo,
View.post (Runnable)
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(b);
}
});
}
}).start();
}
Entrenador de animales
final Handler myHandler = new Handler();
(new Thread(new Runnable() {
@Override
public void run() {
final Bitmap b = loadImageFromNetwork();
myHandler.post(new Runnable() {
@Override
public void run() {
mImageView.setImageBitmap(b);
}
});
}
})).start();
}
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/