Android wait () no funciona

Esta es mi primera pregunta aquí, así que por favor perdóneme si desobedeciera alguna de las reglas del foro.

Necesito que mi programa espere 3 segundos y luego cambie la vista de contenido

Mi código es:

setContentView(R.layout.logout); new Thread(new Runnable() { @Override public void run(){ try { synchronized(this){ wait(3000); } } catch(InterruptedException ex){ } } }).start(); setContentView(R.layout.main); 

El programa funciona sin errores, pero no hay espera. Cuando llega a esta parte, sólo muestra el diseño "principal" sin mostrar el "logout" de diseño en absoluto.

¿Qué hay de malo en mi enfoque?

Como la gente notó, no duerma ni bloquee el hilo de la interfaz de usuario, pero parece que está consciente de esto con el nuevo hilo creado.

Ahora por qué no se comporta como usted quiere:

En este momento, llama a setContentView() , inicia un nuevo subproceso, llama a setContentView() una segunda vez en el subproceso de UI – esto sucede en rápida sucesión sin demora / wait / sleep inbetween. La wait(3000) ocurre en el nuevo hilo que inició – de modo que el nuevo hilo comienza, espera 3000ms y, a continuación, sale. Es un no-op caro.

setContentView() realizar la segunda llamada a setContentView() desde el interior del método setContentView() de ese nuevo subproceso para obtener el efecto deseado. Además, debe usar sleep() lugar de wait()wait() es una herramienta de bajo nivel para sincronizar subprocesos mientras sleep() es el habitual "no continúe por X cantidad de tiempo".

Permítanme proponer una mejor manera:

Una aproximación posiblemente más agradable y mucho más ligera está utilizando Handler.postDelayed() – esto le permite invocar un Runnable en el hilo de interfaz de usuario después de un retraso:

 setContentView(R.layout.logout); new Handler().postDelayed(new Runnable() { @Override public void run() { setContentView(R.layout.main); } }, 3000); 

Editar para responder a tu comentario:

Defina y encuentre el botón antes del Runnable como una variable final , de esta manera podrá acceder a él más tarde desde dentro del Runnable.

Tenga en cuenta que para hacer referencia a this instancia de la clase circundante desde dentro de una clase interna anónima (su new Runnable() ), debe prefijarla con el nombre de clase de la clase circundante (su clase de Activity ):

 final View submitButton = findViewById(R.id.submit_button); setContentView(R.layout.logout); new Handler().postDelayed(new Runnable() { @Override public void run() { setContentView(R.layout.main); // adapt to your actual Activity class name: submitButton.setOnClickListener(YourClassName.this); } }, 3000); 

wait() no espera una cierta cantidad de tiempo, sino que tiene el hilo actual espera para que this haga un notify() durante un tiempo máximo. Lo que está buscando es Thread.sleep() .

Y en este momento lo único que estará esperando, es el hilo adicional que estás engendrando, no la actividad en sí. Es por eso que te sugiero que mires a Handler.postDelayed() , AsyncTask o AsyncTask . El manejo de los hilos es muy bajo.

Su código no funciona para dormir subproceso de interfaz de usuario. Para dormir subtítulo de interfaz de usuario pruebe este código

 new Handler().postDelayed(new Runnable() { public void run() { setContentView(R.layout.main); } }, 3000); 

Intente utilizar Sleep () en lugar de Wait ()

Android.os.SystemClock.sleep (3000)

Por lo que puedo entender la espera está sucediendo en el nuevo hilo donde como usted está llamando setContentView (R.layout.main) en el hilo actual.

Tratar

 setContentView(..) synchronized(this) { this.wait(1000); } setContentView(..) 

Tenga en cuenta que dormir o esperar en el hilo de interfaz de usuario no es una buena práctica.

  • ¿Debo importarme la diferencia entre el hilo principal y el hilo de UI en Lollipop y más allá?
  • OnPostExecute () de AsyncTask nunca se llama en AndroidTestCase
  • Cómo utilizar Runnable.wait () en AsyncTask? ¿Por qué el AsyncTask NO espera ...?
  • Fragmentos e hilos en Android
  • ¿Cómo puedo pasar objetos ejecutables a un manejador?
  • Hilo, Hilo de interfaz de usuario, Hilo de trabajo, Async Task
  • ¿Es esta la forma correcta de obtener el efecto de rizo en los dispositivos pre-piruletas?
  • ¿Debería un MediaPlayer ejecutarse en hilos separados?
  • Esperando que el Cajón de Navegación se cierre antes de inicializar Fragmentos con el lazo vacío while
  • Matando un hilo en java android
  • ¿Los hilos son lo suficientemente fiables para calcular segundos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.