Pregunta

Solo tiene que venir a pulir mi solicitud y por lo que es reanudar después de que el usuario ha dejado. Cuando la aplicación restaura consigo un IllegalThreadStateException, que es bastante molesto. Este problema está presente en el ejemplo Google da de Lunar Lander . Alguien ha encontrado una manera de restaurar de trabajo cuando se utiliza SurfaceView?

¿Fue útil?

Solución

Creo que esto se debe a una disparidad en cómo se manejan la superficie y la actividad. Al salir de la aplicación LunarLander se destruye la superficie (invocando surfaceDestroyed) pero la actividad solo está en pausa (invocando onPause). Cuando la actividad se reanuda se crea la superficie (invocando surfaceCreated) y los intentos de iniciar el hilo de dibujo nuevo.

Esto significa que la creación de la rosca sucede con el ciclo de vida de la Actividad y destruyendo el hilo pasa con ciclo de vida del SurfaceView, que no siempre se corresponden, por lo tanto el IllegalThreadStateException. La solución sería para atar el hilo a un ciclo de vida o el otro, no ambos.

este hilo propone una posible solución, aunque no sé si funciona.

Otros consejos

En mi propia prueba, puedo crear el hilo de dibujo en el método surfaceCreated (), y esto resuelve el problema por completo. Este es mi método de aplicación:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}

Así que en el código, cuando surfaceDestroyed() se llama, se establece en false mRun y pide thread.join(). Esto hace que el hilo de rosca para completar y morir. Cuando la aplicación se inicia de nuevo y surfaceCreated() se llama, llama thread.start(). Esto es válido porque el hilo no se puede iniciar después de que muera.

Hay dos opciones para solucionar:

a) Iniciar un nuevo hilo en surfaceCreated() -. Como anteriormente

b) O añadir un cheque en surfaceDestroyed() contra Activity.isFinishing() sólo para terminar el hilo si es cierto. Para ello, rodeé la while(mRun) en el hilo con otro bucle while que sólo se establece en false si isFinishing() devuelve verdadero.

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