studio programacion herramientas fundamentos con avanzado aplicaciones android

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/