Pergunta

Apenas vêm para polir a minha candidatura e tornando-retomar após o usuário ter deixado. Quando as restaurações de aplicação recebo uma IllegalThreadStateException, que é muito chato. Este problema está presente no exemplo o Google dá de Lunar Lander . Alguém encontrou uma maneira de restaurar a trabalhar quando se utiliza SurfaceView?

Foi útil?

Solução

Eu acredito que esta surge de uma disparidade na forma como a superfície ea atividade são manipulados. Quando você deixar a aplicação LunarLander a superfície é destruído (invocando surfaceDestroyed), mas a atividade só é pausado (invocando onPause). Quando a atividade for retomada a superfície é criada (invocando surfaceCreated) e tenta iniciar o segmento de desenho novamente.

Isto significa que a criação do Tópico acontece com ciclo de vida da Atividade e destruindo o fio acontece com ciclo de vida do SurfaceView, que nem sempre correspondem, assim, a IllegalThreadStateException. A solução seria para amarrar o segmento para um ciclo de vida ou de outro, não ambos.

esta discussão propõe uma solução possível, embora eu não sei se ele funciona.

Outras dicas

No meu teste, eu criar o segmento de desenho no método surfaceCreated (), e isso resolve o problema completamente. Esta é a minha implementação do método:

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

Assim, no código, quando surfaceDestroyed() é chamado, ele define mRun como false e chamadas thread.join(). Isso faz com que o fio para completar e morrer. Quando o aplicativo é iniciado novamente e surfaceCreated() é chamado, ele chama thread.start(). Esta é inválido porque o segmento não pode ser iniciado depois que ele morre.

Duas opções para correção:

a) Iniciar um novo tópico no surfaceCreated() -. Como acima

b) Ou adicionar um check-in surfaceDestroyed() contra Activity.isFinishing() apenas finalizar o thread se for verdade. Para fazer isso, eu cercaram a while(mRun) no segmento com outro loop while que só é definido como falso se isFinishing() retorna verdadeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top