2011-03-25 3 views
6

Mi lectura de la documentación de Android encuentra los métodos forceLayout() (que es para producir una presentación de diseño en la próxima solicitud de diseño) y requestLayout() (que se supone que publica una solicitud de diseño inmediata), pero no puedo hacer que se comporten como se anuncia. En particular, si hago un texto configurado antes de un Thread.Sleep y uno después, espera a que el Sleep termine antes de configurar ambos textos a la vez, si o si llamo a forceLayout() y requestLayout() en el medio. Por favor, no respondas con muchas tonterías sobre cómo no debería llamar a Thread.Sleep en el hilo de UI. Si envuelvo el Thread.Sleep en un CountDownTimer, funciona perfectamente (siempre que tenga el tiempo de marcación lo suficientemente corto como para no interferir con el tiempo de sueño, y la duración del temporizador el tiempo suficiente para permitir que termine el sueño. La siguiente es un ejemplo:forceLayout(), requestLayout()

int i=0; 
TextView tv2; 
TextView tv1; 
LinearLayout ll; 
Button bt; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ll=new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    tv1=new TextView(this); 
    tv2=new TextView(this); 
    bt=new Button(this); 
    bt.setText("Press to start"); 
    ll.addView(bt); 
    ll.addView(tv1); 
    ll.addView(tv2); 
    tv2.setText(""); 
    setContentView(ll); 
    bt.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tv1.setText("starting sleep"); 
      new CountDownTimer(6000,50){ 
       public void onTick(long msuf) 
       {if(i==1) 
        { 
       try{ 
       Thread.sleep(4000); 
       tv2.setText("waking up"); 
       } 
      catch(InterruptedException e){}; 
      } 
       i++; 
       } 
       public void onFinish(){}}.start(); 
       }   
     }); 

     } 
+0

Véase también http://stackoverflow.com/questions/13856180/usage-of-forcelayout-requestlayout-and-invalidate – Suragch

Respuesta

11

[un montón de tonterías acerca de llamar a sleep() en hilo de interfaz de usuario] Si me sale bien, te refieres a tener algo como:.

//...inside onTick() 
try { 
    tv2.setText("almost waking up"); // first setText() 
    Thread.sleep(4000); 
    tv2.setText("waking up"); // second seText() 
} 

Si realiza su sueño hilo principal, se simplemente dejará de procesar cualquier cosa: el método actual, el bucle de hilo y la cola de mensajes. Una vez que esté despierto de nuevo, terminará de ejecutar el método, w con el segundo setText() anulando el primero, y luego deje el ciclo del hilo continue y realice la actualización de UI, mostrando solo el segundo texto.

No requestLayout() ni forceLayout() en realidad puede hacer que la actualización de la interfaz de usuario de inmediato, lo harán tanto horario una solicitud de disposición en el bucle de hilo. No estoy seguro, pero creo que la diferencia entre ellos es que requestLayout() es llamado por una visión que ha cambiado su tamaño/posición en su matriz y forceLayout() es llamado por un ViewGroup que necesita sus hijos que ser re -Dispuesto.

Por lo tanto [más tonterías acerca de llamar sleep() en el hilo UI]. Para tales cosas, llamar a postDelayed() en un manejador de hilo principal es probablemente la mejor solución, si no quiere meterse con el multihilo.

+0

¿Tiene algún consejo sobre cómo puedo forzar mi diseño (todo) para volver a dibujar? Tengo un problema donde alterno la visibilidad de un VideoView que funciona pero el resultado no es visible (pero se puede tocar, así que sé que VideoView está allí o no ...) – WarrenFaith

+0

@WarrenFaith No se me ocurre nada más que llamar 'requestLayout()' o 'invalidate()' en la raíz de su diseño. Sin embargo, creo que es un problema de 'VideoView'. ¿Has probado con 'GONE' e' INVISIBLE'? – bigstones

+0

sí y sin cambios. Si empiezo con visible y trato de hacerlo desaparecer, solo desaparece cuando aparece algo así como un cuadro de diálogo emergente. Lo mismo al comenzar con invisible – WarrenFaith

Cuestiones relacionadas