Domanda

Al momento sto prendendo confidenza con Android, giocare con il campione Lunar Lander.

ho scoperto che se si esce dalla app (ad esempio, ha colpito il pulsante di chiamata) distruggerà la superficie sottostante (chiamando surfaceDestroyed).

La navigazione indietro (che attiverà onWindowVisibilityChanged) l'applicazione andrà in crash, come cercherà di richiamare alla superficie senza ricrearlo.

C'è un certo codice posso mettere in <=> (o in qualsiasi altro), che rigenererà superficie sottostante del SurfaceView e riprendere l'esecuzione bene?

Ci si sente come questo dovrebbe essere una semplice chiamata di funzione, ma non riesco a trovare nulla nella documentazione API.

Grazie!

È stato utile?

Soluzione 2

Mis-diagnosi! L'applicazione ricrea la superficie automaticamente, ma c'è una chiamata in là che cerca di attirare a prima è stato creato.

Come risolvere il 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);
}

Ora è tutto gonfiano. (Per quanto ne sono a conoscenza, in ogni caso - Java / esperti Android Sentitevi liberi di commentare se questa è una cattiva pratica)

Altri suggerimenti

Questa soluzione per "mSurfaceExists = true" non funziona per me. Sembra surfaceCreated () non è sempre chiamato perché super.onWindowVisibilityChanged () non viene chiamato. Quindi non v'è alcuna superficie creata e non va in crash a causa threas.start non è chiamato.

Credo che il problema è il seguente: Chiamata Thread.start () causa l'errore in quanto il thread è stato già avviato. Ma in surfaceDestroyed (), Thread.join provoca il filo per completare e morire. E un filo non può essere riavviato una volta morto.

Sono indovinare il trucco è quello di creare un nuovo thread in surfacecreated o solo a causare il thread per completare quando l'utente chiama l'applicazione per finire (indietro chiave) e non la pausa (tasto Home). Questo può essere controllato chiamando isFinishing () sull'attività.

Non sono sicuro se questo funzionerà. Cercherò presto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top