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
- Utilizar Otto para actualizar un listadapter de un GcmListenerService
- Android: puede AsyncTask devolver en otro hilo de rosca de interfaz de usuario?
- Cómo sincronizar correctamente el código RenderScript de Android en Nvidia Shield
- Android - ¿Cómo es posible que un servicio siga funcionando después de que la Actividad haya sido cerrada?
- AsyncTask para actualizar widget - cómo acceder a textviews en onPostExecute ()?
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?
- Convertir flujo de entrada en mapa de bits
- ObjectInputStream - ¿Cómo esperar a nuevos datos?
- Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas." Error en Fragmento
- Android y Java: uso de runnable
- Cámara Android: ¿Hilos? Que debe hacer lo que
- Programación con SurfaceView y estrategia de hilos para el desarrollo de juegos
- Nexus 5 va a modo de espera hace ciclo de vida de actividad buggy
- ¿Cómo obtener datos desde / hacia un socket en un hilo?
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.
- Reformate archivos completos del proyecto en Android Studio
- Progreso intermedio no funciona con ActionBarSherlock ejecutándose en Gingerbread