Android: Znovuzískání zaostření pomocí SurfaceView

hlasů
5

Jsem v současné době dostat ke rvačce s operačním systémem Android, hraní si se vzorkem Lunar Lander.

Zjistil jsem, že pokud opustíte aplikace (např stiskněte tlačítko volání) zničí podkladovou plochu (volání surfaceDestroyed).

Navigace zpět (což spustí onWindowVisibilityChanged), aplikace se zhroutí, protože se bude snažit čerpat na povrch bez opětovného ji.

Je tam nějaký kód mohu dát do onWindowVisibilityChanged(nebo kdekoli jinde), který bude regenerovat podkladový povrch SurfaceView a pokračovat v provádění hezky?

Vypadá to, jako by to mělo být jednoduché volání funkce, ale nemohu najít nic docs API.

Dík!

Položena 23/03/2009 v 06:37
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Toto řešení pro „mSurfaceExists = true“, není práce pro mě jeden. Vypadá to, že surfaceCreated () není stále nazvaný protože super.onWindowVisibilityChanged () není volána. Takže není povrch vytvořen a to nespadne, protože threas.start není volána.

Domnívám se, že problém je: Volání thread.start () způsobí chybu, protože nit byla již zahájena. Ale v surfaceDestroyed (), thread.join způsobuje, že vlákno k dokončení a zemřít. A nitě nemůže být restartován po smrti.

Já jsem hádat, trik je vytvořit nové vlákno v surfacecreated nebo pouze způsobit vlákno k dokončení, když je uživatel volá aplikace až do konce (zadní klíč) a ne se zastavil (tlačítko Domů). To lze zkontrolovat voláním isFinishing () na aktivitu.

Není si jistý, jestli to bude fungovat. Budu se snažit to hned.

Odpovězeno 04/11/2010 v 21:28
zdroj uživatelem

hlasů
1

Mis-diagnóza! automaticky aplikace znovu vytvoří na povrchu, ale je tu výzva tam, který se snaží vypracovat k ní před jejím vytvoření.

Řešení problému:

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

Teď je to všechno prima. (Pokud je mi známo, tak jako tak - Java / odborníci Android bez obav, aby se vyjádřil, jestli je to špatná praxe!)

Odpovězeno 23/03/2009 v 07:45
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more