2011-09-29 14 views

Respuesta

33

Si desea volver a dibujar su vista desde UI Thread puede llamar al método invalidate().

Si desea volver a dibujar su vista desde Non UI Thread puede llamar al método postInvalidate().

Cada clase que se deriva de la clase View tiene el método invalidar y posInvalidar. Si se llama a invalidación, le dice al sistema que la vista actual ha cambiado y se debe volver a dibujar tan pronto como sea posible. Como este método solo puede invocarse desde UIThread, se necesita otro método para cuando no se encuentre en UIThread y aún desee notificar al sistema que su Vista ha sido modificada. El método postInvalidate notifica al sistema desde un mensaje no UIThread y la vista se vuelve a dibujar en el siguiente evento en el UIThread lo antes posible. También se explica en breve en la documentación del SDK:

CLICK HERE

ACTUALIZACIÓN:

Hay algunos problemas que surgen al utilizar postInvalidate de otros temas (como no tener la actualización de la interfaz de usuario derecha de distancia), este será más eficiente:

runOnUiThread(new Runnable() { 
    public void run() { 
    myImageView.setImageBitmap(image); 
    imageView.invalidate(); 
    } 
}); 
+3

¿No será eso exactamente lo que postInvalidate() hace? – rupps

+0

En el código de ejemplo de Android: http://developer.android.com/training/custom-views/index.html, hay un PieChart.java que tiene getters de propiedades y setters dentro. La mayoría de los establecedores de propiedades llama a invalidate() ;. ¿No es PieChart.java un hilo de interfaz de usuario y cómo puede llamarse invalidar desde allí? (hay un archivo java de actividad principal que es el hilo principal). Hubiera esperado una llamada a postinvalidate(); cómo lo hicieron bajo el método onDraw en PieChart.java. – Simon

+0

@Simon No he revisado el código, pero PieChart.java aún estaría trabajando en el subproceso de la interfaz de usuario a menos que amplíe el subproceso o especifique otro subproceso para usar de alguna otra manera. Lo que probablemente ocurra es que se dibuje el gráfico circular, luego se llama a 'postInvalidate()' dentro del gráfico circular 'onDraw' para dibujar el gráfico circular en una vista en el hilo de la interfaz de usuario. –

Cuestiones relacionadas