Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Reinicio / Pausa del hilo en onResume / onPause

Tengo un juego que utiliza la implementación de SurfaceView para mostrar los objetos. Tengo un hilo que dibuja el SurfaceView tiempo-a-tiempo a la pantalla. El juego se está ejecutando completamente. Desafortunadamente, necesitaba tener una función de pausa cuando el juego se interrumpía. Bueno, sé que necesito manipular onResume y onPause .

Pero no puedo hacerlo bien. El error me señala de nuevo a surfaceCreated donde comienzo el hilo diciéndome que el hilo ha comenzado ya. Intenté usar el resume y suspend en el onResume y onPause respectivamente, pero nada cambió.

  • Preguntas sobre el cifrado de activos de aplicaciones de Google Play
  • ¿Cómo detectar la disponibilidad de funciones de hotspot móvil en Android mediante programación?
  • La visualización / visualización de la cámara en pantalla completa no mantiene la relación de aspecto: la imagen está sesgada, estirada para encajar en la pantalla
  • Conectando a la base de datos externa - Aplicación de Android
  • La actividad no se puede asignar a la actividad
  • No puede enviar mensajes desde el servidor: Google Cloud Messaging
  • ¿Cómo puedo conseguir esto? Ya he hecho cómo la ubicación de los objetos se guardaría con el manejo de archivos-I / O.

    Gracias por adelantado.

  • OnCreate flujo continúa después de terminar ()
  • ¿Cómo cambiar una distancia de 1 metro a píxel?
  • Inicializando Games Client en Android
  • Efecto de ondulación sólo funciona en primer elemento ListView
  • Cómo cambiar el fondo clave de cualquier tecla en el teclado suave de Android
  • Android Speech Recognition API no funciona en Android 7 Nougat
  • 4 Solutions collect form web for “Reinicio / Pausa del hilo en onResume / onPause”

    Sin conocer los entresijos de su código.

    Para "Pausar" un subproceso puede implementar la funcionalidad de la siguiente manera:

     while(! this.isInterrupted()) if(!paused) { ... Do something ... } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

    Esto depende si Do something invalida su vista de superficie o controla la progresión en su aplicación. Un accesor a paused debe permitirle pausar y reanudar su hilo sin quedar atrapado en cualquier otro pedacito de arquitectura.

    Esto es lo que hice:

      @Override public void surfaceCreated(SurfaceHolder arg0) { if (thread.getState() == Thread.State.TERMINATED){ CreateThread(getHolder(),getContext()); } thread.setRunning(true); thread.start(); } 
    • En CreateThread usted debe tener el hilo = nuevo MyThread (…);
    • El setRunning (boolean mRun) utiliza un booleano para iniciar / detener la función de ejecución (creo que me inspiró el LunarLander);

    Si desea utilizar correctamente el onPause / onResume no coloque las variables utilizadas por el hilo dentro del hilo (como se hace en LunarLander). Te sugiero que hagas así:

     // Variables declarations public MyGameThread CreateThread(...){ thread = new MyGameThread(holder, context, new Handler() { // and so on.... }); } 

    Cuando pasa a través de la onPause / onResume, su hilo será destruido y reneweled, pero si usted pone sus variables fuera de ella, puede seguir utilizándolos después.

    Si tiene algo importante que conservar, utilice una de estas opciones:

    • SharedPreferences: se creará un xml y se guardará localmente con variables que persisten incluso después del final de la aplicación;
    • Un db de SQL si manejaría más de 5-10 variables porque en este caso el uso de la opción anterior sería difícil.

    En realidad no se recomienda detener un hilo por usted mismo, el método stop() está obsoleto. La solución más sencilla es usar un indicador en el bucle while dentro del método run() del thread. Cuando necesite "detener" el hilo, simplemente coloque la bandera en false y el hilo no hará nada más, a pesar de que seguirá funcionando. Android detendrá su hilo cuando sea necesario. Espero que esto ayude.

    No estoy seguro si usted tiene uno o dos hilos en esta pregunta, estoy asumiendo 2. Usted necesita hacer tres cosas cuando usted llama onPause:

     1 - Save the state of the application (all game variables, states, etc) 2 - Kill the surfaceView by calling suspend. 3 - Kill the other thread (we'll call it Thread B). 

    Matar a Thread B es su problema, creo. Desea interrumpir el hilo y decirle que lo deje, o bien cuando llama a onPause su hilo seguirá haciendo lo suyo. Luego, cuando regrese al juego, el hilo intentará volver a crearse lo que causa el problema. Hay 2 maneras de matar un hilo correctamente:

    • En el bucle while() de tu subproceso, tiene una 'ejecución' booleana que ejecutará el código while(run) . Cuando cambia a false, el hilo sale.
    • Si su hilo duerme (supongo que puede hacer desde su un juego y se ejecutará wrt tiempo), coger el InterruptedException y luego salir allí. Cuando desee eliminar el hilo, lanzará la excepción al subproceso.

    La primera es, con mucho, la más fácil.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.