2010-07-14 18 views
14

He intentado con hilos, pero Android lanza "CalledFromWrongThreadException: solo el hilo original que creó una jerarquía de vista puede tocar sus vistas".¿Cómo mostrar una vista durante 3 segundos y luego ocultarla?

Entonces, ¿cómo puedo esperar 3 segundos y luego ocultar la vista, dejando que la GUI responda?

-

un temporizador utiliza otro hilo ya sea, por lo que no va a resolver ..

+0

ejemplo simple para la pantalla de bienvenida en Android, Userful a que: [aquí] (http://www.androidpeople.com/android-loading-welcome-splash-spash-screen-example "ejemplo de pantalla spash") – Popeye

Respuesta

15

freza un hilo separado que duerme durante 3 segundos y luego llamar runOnUiThread para ocultar la vista.

Thread thread = new Thread() { 
     @Override 
     public void run() { 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
      } 

      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        // Do some stuff 
       } 
      }); 
     } 
    }; 
    thread.start(); //start the thread 
+2

Un 'Mensaje' y un' Manejador' serían una forma más de Android para hacer lo mismo, particularmente cuando se trata de UI manipulación. – Dave

+0

todavía hace que la GUI no responda a mi pulsación de tecla mientras el hilo está en reposo. –

+0

@Dave Me gustaría leer más sobre .. –

42

Existe una manera más fácil de hacerlo: utilizar View.postDelayed(runnable, delay)

View view = yourView; 
view.postDelayed(new Runnable() { 
     public void run() { 
      view.setVisibility(View.GONE); 
     } 
    }, 3000); 

No es muy preciso: puede estar oculto en 3,5 o 3,2 segundos, porque se publica en la cola de mensajes del subproceso de interfaz de usuario.

Use post() o runOnUiThread() solo algo como setTimeout().

+0

¡agradable y fácil! Gracias .. –

+4

Supongo que debería ser postDelayed y no publicar – marcinj

+1

+1 Como es mucho menos problemático que usando 'wait' o' sleep'. Pero tienes un error tipográfico (es 'Runnable() {...}', y falta ';') arreglalo para que puedas obtener más votos ascendentes. También señala por mencionar 'runOnUithread'. Y lo que viene a continuación es porque soy un poco obsesivo con los detalles, pero ¿quizás corregiré el uso del inglés en algunas oraciones? (¡No me mates por favor!;)). Solo digo porque creo que esta debería ser la respuesta aceptada. – acrespo

12

Sin la necesidad de tener una referencia a una vista o dormir un hilo:

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      // do stuff 
     } 
    }, 3000); 
Cuestiones relacionadas