Pergunta

Atualmente estou chegar ao confronto com Android, brincar com a amostra Lunar Lander.

Descobri que se você sair do aplicativo (por exemplo, apertar o botão de chamada) que vai destruir o (surfaceDestroyed chamando) superfície subjacente.

Navegação de volta (o que irá desencadear onWindowVisibilityChanged) o aplicativo irá falhar, uma vez que irá tentar atrair para a superfície sem recriá-lo.

Existe algum código que pode colocar em onWindowVisibilityChanged (ou em qualquer outro lugar) que vai gerar a execução de superfície e currículo subjacente do SurfaceView bem?

Parece que esta deve ser uma chamada de função simples, mas eu não consigo encontrar nada na documentação da API.

Obrigado!

Foi útil?

Solução 2

Mis-diagnóstico! O aplicativo recria a superfície automaticamente, mas há uma chamada lá dentro que tenta desenhar a ele antes de ser criado.

Corrigir o 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);
}

Agora é tudo swell. (Tanto quanto eu estou ciente, de qualquer maneira - Java / peritos Android à vontade para comentar se esta é uma prática ruim)

Outras dicas

Esta solução para "mSurfaceExists = true" não está funcionando para mim. Parece que surfaceCreated () não está sendo chamado porque super.onWindowVisibilityChanged () não é chamado. Portanto, não há superfície criada e não falhar porque threas.start não é chamado.

Eu acredito que o problema é: Chamando Thread.Start () faz com que o erro porque o segmento já foi iniciado. Mas, em surfaceDestroyed (), Thread.Join faz com que o thread para completa e morrer. E um segmento não pode ser reiniciado uma vez morto.

Eu estou supondo que o truque é criar um novo tópico no surfacecreated ou única causa a linha para completar quando o usuário está chamando o aplicativo para acabamento (chave de volta) e não parando (chave de casa). Isto pode ser verificado chamando isFinishing () sobre a atividade.

Não tenho certeza se isso vai funcionar. Vou tentar ser tão cedo.

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