Cómo establecer el retraso en la función onClick de Android

) Estoy en un proceso de crear un juego de memoria. Mi problema es que cada vez que hago clic por segunda vez, ni siquiera puedo ver el botón girado. Para ser claros, primero haga clic en el botón para alternar, para que pueda ver el número que contiene, el segundo clic en un botón para alternar diferente es para alternar, muéstreme el número y luego proceda a establecer un puntaje +1 si los números son el lo mismo, o invertirlos nuevamente si son diferentes.

A continuación se muestra el código que uso como función onClick, he estado pensando en poner algún tipo de función sleep o delay en algún lugar del segundo “if block” – (if (klikniecia == 2)).

Cualquier ayuda sobre este tema sería apreciada.

public void onClick(View view) { for (int i = 0; i < karta.length; i++){ if (view == karta[i]){ karta[i].setEnabled(false); klikniecia++; if (klikniecia == 1){ kartaID[0]=i; kartaWartosc[0]=listaKart.get(i); } if (klikniecia == 2){ kartaID[1]=i; kartaWartosc[1]=listaKart.get(i); //i think, about setting a delay here, so i can see both of the cards, regardles if the're the same or not before reverting them. if (czyPara()){ karta[kartaID[0]].setEnabled(false); karta[kartaID[1]].setEnabled(false); klikniecia=0; } else{ karta[kartaID[0]].setEnabled(true); karta[kartaID[0]].toggle(); karta[kartaID[1]].setEnabled(true); karta[kartaID[1]].toggle(); klikniecia=0; } } } } 

}

En lugar de dormir en el clic, podría publicar un mensaje retrasado en un controlador (con el ejecutable asociado) y hacer que actualice la UI. Obviamente, encaja esto en el diseño de tu aplicación y haz que funcione, pero la idea básica es esta:

 //Here's a runnable/handler combo private Runnable mMyRunnable = new Runnable() { @Override public void run() { //Change state here } }; 

Luego, desde onClick, publica un mensaje retrasado en un controlador, especificando que el ejecutable se puede ejecutar.

 Handler myHandler = new Handler(); myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second. 

Dependiendo de lo complicado que sea tu juego, puede que esto no sea exactamente lo que quieres, pero debería comenzar.

Correctamente trabajo:

 final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //Do something after 100ms } }, 100); 

Nunca debe dormir en el subproceso de interfaz de usuario (de forma predeterminada, todo el código se ejecuta en el subproceso de interfaz de usuario): solo congelará la interfaz de usuario, no permitirá que algo cambie o finalice. No puedo sugerir más porque no entiendo la lógica del código.

No duerma en el hilo de la interfaz de usuario. Necesita otro hilo que busque un mensaje de “despertar y esperar” de su subproceso de interfaz de usuario. Ese segundo hilo podría ocultarse después de una llamada de sueño normal. Luego puede mantener el hilo la próxima vez que necesite ocultar algo, o matarlo y encender uno nuevo cada vez que necesite otro retraso.

Creo que hay algunas funciones de “postFoo” que pueden ser útiles en este contexto (desencadenar eventos de IU desde fuera del hilo de UI).

 b.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub final ProgressDialog myPd_ring=ProgressDialog.show(MainActivity.this, "confident checker", "calculating please wait..", true); myPd_ring.setCancelable(true); new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub try { Thread.sleep(5000); } catch(Exception e){} b.dismiss(); } }).start(); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), "today your confident level is 90% ", Toast.LENGTH_LONG).show(); } }, 5000); } });