¿Cómo puedo usar Thread.sleep ()?

Estoy creando un Memo Game para un proyecto escolar y tengo un problema con mi Thread.sleep.

Cuando el jugador devuelve dos cartas, el programa verifica si son idénticas. Si no lo son, se ponen boca abajo. Como el programa lo hace casi al instante, me gustaría hacer una pausa para que el jugador tenga tiempo de ver la segunda carta. El problema es que el descanso es antes de que la carta gire

if (deck1.contains(carte)) {
    if (carte.getEtat() == 0) {
        carte.setEtat(1);
        cartesRetournees1.add(carte);
        majAffichage(carte);

        try {
            Thread.sleep(500);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    }
    if (cartesRetournees1.size() == 2) {
        int nouveauEtat = 0;
        if (cartesRetournees1.get(0).getMotif() == cartesRetournees1.get(1).getMotif()) {
            nouveauEtat = -1;
            this.nbPairsTrouvees++;
        }

        cartesRetournees1.get(0).setEtat(nouveauEtat);
        cartesRetournees1.get(1).setEtat(nouveauEtat);

        majAffichage(cartesRetournees1.get(0));
        majAffichage(cartesRetournees1.get(1));
        cartesRetournees1.remove(1);
        cartesRetournees1.remove(0);

        if (nbPairsTrouvees == this.plateau.size()) System.out.println("GAGNE !");
    }
}

En mi juego, Thread.sleep funciona antes que majAffichage (carte) y no entiendo por qué. No sé cómo resolver mi problema y si ustedes pueden ayudarme, estaría muy agradecido :)

Respuesta 1

Es por cómo funciona la interfaz de usuario y el dibujo. Dentro del marco de Android en el hilo principal, hay un mensaje de procesamiento de bucle de eventos gigante. Uno de esos mensajes es un mensaje de sorteo. La pantalla solo se dibuja cuando se procesa ese mensaje. Los mensajes solo se pueden procesar en la parte superior del bucle. Entonces, si el hilo duerme, nunca procesa nuevos mensajes durante ese sueño, y la pantalla no se actualizará.

Si desea hacer algo en un retraso como ese, hay dos opciones:

1) En lugar de dormir, publique un Runnable en el bucle principal con postDelayed, para que el runnable se ejecute en el momento que especifique en el futuro.

2) Use un segundo subproceso y ejecute toda la lógica del juego allí, pasándole mensajes cuando ocurran eventos de IU y devolviendo eventos al hilo principal cuando necesite dibujar.

Respuesta: 2

Primero, no pausa el hilo principal sino el hilo de fondo porque no desea congelar toda la aplicación.

En segundo lugar, use System.sleep () en lugar de Thread.sleep () porque el primero no arroja una excepción.

Respuesta: 3

Puedo depurar remotamente el procesador personalizado apache nifi en eclipse (ref: 1,2,3). Los pasos que sigo son los siguientes: Descomentar debajo de la línea en apache nifi bootstrap.conf java.arg.debug = -agentlib: ...

Tengo una aplicación de teléfono para mostrar imágenes en una galería en diferentes páginas. Estoy usando el botón rápido de Google https://developers.google.com/mobile/articles/fast_buttons para reducir los 300 ms ...

¿Es posible iterar sobre un mapa creado por MapMaker en orden LRU? com.googlecode.concurrentlinkedhashmap tiene los métodos ascenndingKeySet y descendingKeySet, pero estos no parecen ser ...

Tengo un árbol que devuelve la siguiente estructura: [{"data": {"id": 15, "permissionId": "perm1", "name": "Events"}, "children": [{"data": { "carné de identidad":...