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ó.
- Android: problema SurfaceView (anchura, altura)
- Cómo hacer que una clase que extiende SurfaceView iniciar una actividad?
- SurfaceView parpadeo / desgarro
- Ocultar una vista de superficie que se superpone a otra
- End SurfaceView y GameThread al salir de la aplicación
¿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.
- Android: FPS bajo que dibuja muchos mapas de bits en una vista de superficie
- ¿Puedo usar lockCanvas () en onPreviewFrame callback?
- Cámara Android: la vista previa se amplía al grabar vídeo
- Cómo capturar la imagen de CameraView personalizado en Android?
- Ajuste de una vista previa de la cámara a un SurfaceView más grande que la pantalla
- Vista superficial en capas en un FrameLayout en Android
- Fragmentos - El niño especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero
- SurfaceView onMeasure () no estableció la dimensión medida llamando setMeasuredDimension ()
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ódigowhile(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.
- CoordinatorLayout bloquea la aplicación con IndexOutOfBoundsException
- Android: ¿Qué es transport y jsonFactory en GoogleIdTokenVerifier.Builder?