Android IllegalThreadStateException в LunarLander - PullRequest
1 голос
/ 25 марта 2009

Просто приступите к полировке моего приложения и возобновите его после того, как пользователь ушел. Когда приложение восстанавливается, я получаю IllegalThreadStateException, что довольно раздражает. Эта проблема присутствует в примере, который Google выдает: Lunar Lander . Кто-нибудь нашел способ восстановить работу при использовании surfaceView?

Ответы [ 3 ]

4 голосов
/ 26 марта 2009

Я полагаю, что это происходит из-за несоответствия в том, как обрабатываются Поверхность и Деятельность. Когда вы выходите из приложения LunarLander, поверхность разрушается (вызывая surfaceDestroyed), но действие только приостанавливается (вызывая onPause). Когда действие возобновляется, поверхность создается (вызывая SurfaceCreated), и она пытается снова начать процесс рисования.

Это означает, что создание потока происходит с жизненным циклом действия, а уничтожение потока происходит с жизненным циклом SurfaceView, который не всегда соответствует, таким образом, исключение IllegalThreadStateException. Решением было бы связать нить с одним жизненным циклом, а не с обоими.

Я думаю эта тема предлагает возможное решение, хотя я не знаю, работает ли оно.

2 голосов
/ 20 августа 2010

В моем собственном тесте я создаю поток рисования в методе surfaceCreated (), и это полностью решает проблему. Это мой метод реализации:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}
0 голосов
/ 05 ноября 2010

Таким образом, в коде, когда вызывается surfaceDestroyed(), он устанавливает mRun в false и вызывает thread.join(). Это приводит к тому, что поток завершается и умирает. Когда приложение запускается снова и вызывается surfaceCreated(), оно вызывает thread.start(). Это недопустимо, потому что поток не может быть запущен после его смерти.

Два варианта исправления:

a) Начать новую тему в surfaceCreated() - как указано выше.

b) Или добавьте проверку в surfaceDestroyed() против Activity.isFinishing(), чтобы завершить поток, только если это правда. Для этого я окружил while(mRun) в потоке другим циклом while, который имеет значение false, только если isFinishing() возвращает true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...