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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top