Cómo actualizar la vista de imagen inmediatamente

En mi aplicación para Android, descargo una imagen de la nube. La descarga se realiza en un hilo y en ese mismo hilo también establezco una vista de imagen con la imagen recién descargada. Después de configurar la imagen, entonces llamo a postinvalidate() .

Sin embargo, la imagen no aparece inmediatamente. ¿Hay una manera de hacer que el redibujo ocurra de inmediato? Necesito una manera de desencadenar un ciclo de dibujo.

Cada clase que se deriva de la clase View tiene el método invalidate() y postInvalidate() . Si se invalidate() le dice al sistema que la vista actual ha cambiado y que debería volver a dibujarse lo antes posible . Como este método sólo se puede llamar desde su UIThread otro método es necesario para cuando no está en el UIThread y todavía quiere notificar al sistema que su vista se ha cambiado. El método postInvalidate() notifica al sistema desde un archivo que no es UIThread y la Vista se vuelve a dibujar en el siguiente evento en el UIThread tan pronto como sea posible.

En su caso, puede lograr lo que desea con la ayuda de AsyncTask (un hilo de backround inteligente). AsyncTask permite un uso adecuado y fácil del hilo de la interfaz de usuario. Esta clase permite realizar operaciones de fondo (descargar imagen en segundo plano en su caso) y publicar resultados (establecer su mapa de bits a su ImageView) en el subproceso de interfaz de usuario sin tener que manipular subprocesos y / o controladores.

Una tarea asincrónica se define por un cálculo que se ejecuta en un subproceso de fondo y cuyo resultado se publica en el subproceso de interfaz de usuario. Una tarea asíncrona está definida por 3 tipos genéricos , llamados Params, Progress y Result, y 4 pasos , llamado begin, doInBackground, processProgress y end.

Los 4 pasos

Cuando se ejecuta una tarea asincrónica, la tarea pasa por 4 pasos:

onPreExecute() , invocado en el subproceso de interfaz de usuario inmediatamente después de ejecutar la tarea. Este paso se utiliza normalmente para configurar la tarea, por ejemplo, mostrando una barra de progreso en la interfaz de usuario antes de descargar la imagen desde la nube y que se utiliza para proporcionar una buena experiencia de usuario.

doInBackground(Params...) , invocado en el subproceso de fondo inmediatamente después de que onPreExecute () termine de ejecutarse. Este paso se utiliza para realizar cálculos de fondo que pueden tardar mucho tiempo. Los parámetros de la tarea asincrónica se pasan a este paso. El resultado del cálculo debe ser devuelto por este paso y se pasará de nuevo al último paso. Este paso también puede usar publishProgress (Progress …) para publicar una o más unidades de progreso. Estos valores se publican en el subproceso de UI, en el paso onProgressUpdate (Progreso …).

onProgressUpdate(Progress...) , invocado en el subproceso de la interfaz de usuario después de una llamada a publishProgress(Progress...) . La temporización de la ejecución no está definida. Este método se utiliza para mostrar cualquier forma de progreso en la interfaz de usuario mientras el cálculo de fondo sigue ejecutándose.

onPostExecute(Result) , invocado en el subproceso de interfaz de usuario después de que finaliza el cálculo de fondo. El resultado de la computación de fondo se pasa a este paso como un parámetro en ese método puede establecer el mapa de bits a su imageView e invalidar sus vistas

¿Intentaste usar invalidate() ? Obliga a volver a dibujar la vista inmediatamente y no durante el siguiente ciclo

Invalidar no funciona. Cambiar el uri o url o la trayectoria de la imagen temporalmente y cambiar de nuevo a la trayectoria requerida trabaja. Por ejemplo, si tengo

 image_url="myhost/img.png"; himg.setImageUrl(image_url, imageLoader); 

Puedo actualizar esto como:

  himg.setImageUrl(null, imageLoader); himg.setImageUrl(image_url, imageLoader) 
 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (!socket.isClosed()) { imgArray = receiveImagebytes(); } } }).start(); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } while (!socket.isClosed()) { runOnUiThread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub imageView.setImageBitmap(BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length)); imageView.invalidate(); } }); 
  • ¿Una manera fácil de detectar dónde se está bloqueando el hilo de ui en Android?
  • Android ¿por qué esto NO arroja una excepción de hilo incorrecto?
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • Precisión del sueño del hilo
  • El hilo no vuelve después de notifyall ()
  • Cómo comprobar si se ejecuta en el hilo de la interfaz de usuario en Android?
  • Lo que se mata con el hilo de la interfaz de usuario de Android
  • En android, ¿por qué la interfaz de usuario no se puede actualizar fuera del hilo de la interfaz de usuario?
  • ¿Una clase anónima mantiene referencias externas vivas?
  • ¿Puede alguien ayudarme a entender el enhebrado de mi programa?
  • ¿Cómo puede el puerto AsyncTask de Android a Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.