Android IllegalThreadStateException v LunarLander

hlasů
1

Stačí přijít na leštění mé žádosti a dělat to znovu poté, co uživatel opustil. Když aplikace obnoví získám IllegalThreadStateException, což je docela nepříjemné. Tento problém je přítomen v uvedeném příkladu Google dává na Lunar Lander . Má někdo našel způsob, jak obnovit práci při používání surfaceView?

Položena 25/03/2009 v 20:45
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

Věřím, že to vyplývá z rozdílnosti jak Surface a aktivity jsou zpracovány. Po opuštění aplikace LunarLander povrch je zničen (vyvolání surfaceDestroyed), ale aktivita je pozastaven pouze (vyvolání onPause). Je-li činnost obnovena se vytvoří povrch (vyvolání surfaceCreated) a pokusí se spustit kreslicí nit znovu.

To znamená, že vytvoření závitu se děje s životním cyklem je aktivita a zničení nit stane s SurfaceView jeho životního cyklu, které ne vždy odpovídají tím i IllegalThreadStateException. Řešením by bylo svázat nit jednoho cyklu nebo jiný, ne obojí.

Myslím, že toto vlákno navrhuje možné řešení, i když nevím, jestli to funguje.

Odpovězeno 26/03/2009 v 18:10
zdroj uživatelem

hlasů
2

V mém testu jsem vytvořit kreslicí vlákno v metodě surfaceCreated (), a to řeší problém zcela. To je můj Implementace metody:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}
Odpovězeno 20/08/2010 v 19:15
zdroj uživatelem

hlasů
0

Takže v kódu, když surfaceDestroyed()je volána, nastaví mRunna hodnotu false a volání thread.join(). To způsobí, že vlákno k dokončení a zemřít. Když je aplikace znovu spustí a surfaceCreated()je nazývána, volá thread.start(). To je neplatný, protože vlákno není možné nastartovat poté, co zemře.

Dvě možnosti, jak opravit:

a) Začít novou nit surfaceCreated()- jak je uvedeno výše.

b) Nebo přidat šek v surfaceDestroyed()proti Activity.isFinishing()pouze ukončit vlákno pokud je to pravda. Jak to udělat, je obklopen jsem while(mRun)v závitu s jiným while, která je nastavena pouze na false, pokud isFinishing()se vrátí true.

Odpovězeno 05/11/2010 v 03:07
zdroj uživatelem

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