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ó.

¿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.

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.

  • El video de la API de MediaCodec de Android se reproduce demasiado rápido
  • El nuevo procesamiento de gms.maps.MapView se retrasa un poco cuando está en un ListView?
  • Crash con SurfaceView en Android NDK al pausar / reanudar la aplicación rápidamente
  • Filtro en vivo de la cámara Android
  • ¿Cómo mostrar la vista previa de la cámara en un SurfaceView?
  • ¿Mejora el rendimiento de la vista personalizada SurfaceView-dervied?
  • Android Surfaceview Crash sin salida de error
  • Cámara androide2 procesa cada fotograma y muestra su vista previa
  • Haga un SurfaceView más grande que la pantalla (Ajuste de una vista previa de cámara a un SurfaceView más grande que la pantalla)
  • Adición de vista de texto a la vista de superficie
  • Cómo crear y guardar una captura de pantalla desde una vista de superficie?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.