Android: La recuperación de enfoque utilizando SurfaceView
-
21-08-2019 - |
Pregunta
Actualmente estoy llegar a enfrentarse con Android, jugando con la muestra Lunar Lander.
He encontrado que si se desplaza lejos de la aplicación (por ejemplo, pulsó el botón de llamada) que va a destruir la superficie subyacente (llamando a surfaceDestroyed
).
Navegando hacia atrás (lo que dará lugar onWindowVisibilityChanged
) la aplicación se bloqueará, ya que tratar de sacar a la superficie sin volver a crearlo.
¿Hay algún código que puede poner en <=> (o en cualquier otro lugar) que regenerará la superficie subyacente del SurfaceView y reanudar la ejecución bien?
Se siente como esto debería ser una llamada de función simple pero no puedo encontrar nada en los documentos de la API.
Gracias!
Solución 2
Mis-diagnóstico! La aplicación recrea la superficie de forma automática, pero no hay una llamada en la que hay que intenta llamar a ella antes de que sea creado.
La fijación del problema:
boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
mSurfaceExists = false;
...
}
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceExists = true;
...
}
protected void onWindowVisibilityChanged(int visibility) {
// only call base if there's a surface
if(mSurfaceExists)
super.onWindowVisibilityChanged(visibility);
}
Ahora todo oleaje. (Por lo que yo estoy consciente, de todos modos - Java / Android expertos siento libre de comentar si esto es una mala práctica)
Otros consejos
Esta solución para "mSurfaceExists = true" no está funcionando para mí tampoco. Parece que surfaceCreated () no está recibiendo llamadas porque super.onWindowVisibilityChanged () no se llama. Así se crea ninguna superficie y que no se desplome debido threas.start no se llama.
Creo que el problema es: Llamando hilo.start () hace que el error debido a que el hilo ya se ha iniciado. Pero en surfaceDestroyed (), Thread.Join hace que el hilo para completar y morir. Y un hilo no se puede reiniciar una vez muertos.
Estoy adivinando el truco es crear un nuevo hilo en surfacecreated o solamente a hacer que el hilo para completar cuando el usuario está llamando a la aplicación a terminar (tecla de retroceso) y no haciendo una pausa (tecla de inicio). Esto se puede comprobar llamando isFinishing () sobre la actividad.
No estoy seguro si esto va a funcionar. Voy a intentar esto pronto.