2010-11-06 23 views
35

Básicamente necesito una pausa (basada en unos pocos segundos) para poner en una acción para que el usuario pueda ver lo que sucede antes de que se tome la siguiente acción. Entonces para el blackjack, cuando es el turno del crupier y él decide pegar, él golpea, se agrega una carta y luego decide qué hacer. Entonces, antes de que decida qué hacer a continuación, quiero que el código se detenga para que se pueda "ver" lo que el concesionario está haciendo de esta manera. El distribuidor no completa sus acciones en menos de un segundo y el jugador solo ve Los resultados.¿Cómo hace que el código se detenga durante un par de segundos en Android?

¡Gracias de antemano!

Debo señalar que he intentado usar esperar (inserte el número aquí); pero me dice eclipse que causa un error de interceptación de pila o algo por el estilo y arroja una excepción, sin hacer nada: (

Bueno, esto es interesante, (la forma en que programé las cosas es "interesante") para decir lo menos) Hice el Thread.sleep (5000) y lo arrojé bajo un try catch, duerme durante 5 segundos y luego continúa con el código. Sin embargo, mis actualizaciones de vistas no se muestran hasta que presiono un botón. . (es realmente odiar programación dirigida por eventos)

Respuesta

93

Aprender a pensar en términos de eventos es de hecho la clave aquí puede hacerlo :)

la primera regla es:.. nunca se detendrá el hilo de interfaz de usuario. El hilo de la interfaz de usuario es responsable de mantener tu aplicación sensible. Cualquier trabajo que hagas allí no debería bloquear; haz lo que tienes que hacer y regresa lo más rápido posible. Definitivamente evite hacer E/S en el hilo de la interfaz de usuario. (Hay algunos lugares donde no puede ayudarlo debido a los requisitos del ciclo de vida, por ejemplo, guardar el estado de la aplicación en). Si alguna vez llama al Thread.sleep en el hilo de la interfaz de usuario, lo está haciendo mal.

Android hace cumplir esto con el error "Aplicación que no responde" (o "ANR") que ve el usuario. Cada vez que vea esto en una aplicación de Android, significa que el desarrollador hizo algo que provocó que el hilo de la interfaz de usuario se detuviera por mucho tiempo. Si el dispositivo está realmente empantanado por alguna razón, este error podría no ser culpa del desarrollador de la aplicación, pero generalmente significa que la aplicación está haciendo algo mal.

Puede utilizar este modelo para su ventaja mediante la publicación de sus propios eventos. Esto le brinda una manera fácil de decirle a su aplicación, "haga esto más tarde". En Android, la clave para publicar sus propios eventos está en la clase Handler. El método postDelayed le permite programar un Runnable que se ejecutará después de un cierto número de milisegundos.

Si usted tiene una actividad que se ve algo como esto:

public class MyActivity extends Activity { 
    private Handler mHandler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mHandler.postDelayed(new Runnable() { 
      public void run() { 
       doStuff(); 
      } 
     }, 5000); 
    } 

    private void doStuff() { 
     Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show(); 
    } 
} 

Luego de 5 segundos después de crear la actividad verá la tostada creada en doStuff.

Si está escribiendo un View personalizado es aún más fácil. Las vistas tienen su propio método postDelayed que hará que todo se publique correctamente en el Handler y no es necesario que crees el tuyo propio.

La segunda regla es: Vistas deben única ser modificados en el subproceso de interfaz de usuario. Esas excepciones que estás recibiendo e ignorando significan que algo salió mal y si las ignoras, es probable que tu aplicación comience a portarse mal de maneras interesantes. Si su aplicación hace la mayor parte de su trabajo en otros hilos, puede post eventos directamente a la vista que desea modificar para que las modificaciones se ejecuten correctamente.

Si tiene una referencia a su Activity de esa parte de su código, también puede usar Activity#runOnUIThread, que hace exactamente lo que su nombre indica. Es posible que prefiera este enfoque si publicar en una sola vista no tiene sentido en contexto.

En cuanto a las actualizaciones de las vistas que no aparecen hasta que presionas un botón, ¿qué tipo de vistas son estas? ¿Son vistas personalizadas que dibujan estas actualizaciones? Si es así, ¿recuerda llamar al invalidate después de que los datos cambien para activar el redibujado? Las vistas solo se vuelven a dibujar después de haber sido invalidadas.

+0

Bueno, veo el error de mis maneras es que estoy tratando de modificar las vistas en un hilo diferente que se ejecuta constantemente para que la interfaz de usuario no se bloquee ... ya que no estoy seguro de cómo pasar los valores generados por mi hilo en funcionamiento ... a la interfaz de usuario. Aunque fue una respuesta increíblemente útil, y le agradezco mucho por ello –

+0

Use un AsyncTask – Falmarri

Cuestiones relacionadas