Frage

ich zur Zeit in dem Griff bekommen Android, das Spiel mit der Lunar Lander Probe.

Ich habe festgestellt, dass, wenn Sie aus der App navigieren weg (zB die Ruftaste getroffen) wird die darunter liegende Oberfläche (Aufruf surfaceDestroyed) zerstören.

Die Navigation zurück (die onWindowVisibilityChanged auslösen) wird die App zum Absturz bringen, wie es ohne Neuer es an die Oberfläche ziehen will es versuchen.

Gibt es einen Code, den ich in onWindowVisibilityChanged setzen kann (oder anderswo), dass die Surface des darunter liegende Oberfläche und Fortsetzen der Ausführung gut regenerieren?

Es fühlt sich an wie dies ein einfacher Funktionsaufruf sein sollte, aber ich kann nichts in der API-Dokumentation finden.

Danke!

War es hilfreich?

Lösung 2

Mis-Diagnose! Die App neu erstellt die Oberfläche automatisch, aber es gibt einen Anruf dort, die ihn zu ziehen versucht, bevor es erstellt wird.

Zur Behebung des Problems:

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

Jetzt ist alles anschwellen. (Soweit mir bewusst bin, sowieso - Java / Android Experten fühlen sich frei zu äußern, wenn diese schlechte Praxis)

Andere Tipps

Diese Lösung für „mSurfaceExists = true“ Arbeit ist für mich nicht. Es sieht aus wie surfaceCreated () nicht genannt zu werden, weil super.onWindowVisibilityChanged () wird nicht aufgerufen. So gibt es keine Oberfläche erstellt und es nicht abstürzt, weil threas.start wird nicht aufgerufen.

Ich glaube, das Problem ist: Der Aufruf Thread.start () bewirkt, dass der Fehler, da der Thread bereits gestartet wurde. Aber in surfaceDestroyed (), Thread.Join bewirkt, dass der Thread zu vervollständigen und zu sterben. Und ein Thread kann nicht einmal tot neu gestartet werden.

ich den Trick bin zu raten ist, einen neuen Thread in surfacecreated zu erstellen oder nur den Faden führen zu vervollständigen, wenn Benutzer die Anwendung ruft zu beenden (Rücktaste) und nicht pausieren (Home-Taste). Dies kann durch den Aufruf isFinishing () auf der Aktivität überprüft werden.

Nicht sicher, ob dies funktionieren wird. Ich werde dies bald versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top