Android IllegalThreadStateException в LunarLander

голоса
1

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

Задан 25/03/2009 в 20:45
источник пользователем
На других языках...                            


3 ответов

голоса
3

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

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

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

Ответил 26/03/2009 в 18:10
источник пользователем

голоса
2

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

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}
Ответил 20/08/2010 в 19:15
источник пользователем

голоса
0

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

Два варианта исправить:

а) Начать новую нить surfaceCreated()- как описано выше.

б) Или добавить проверку в surfaceDestroyed()отношении Activity.isFinishing()только конец нити , если оно истинно. Чтобы сделать это, я окружили while(mRun)в потоке с другим контуром в то время как только значение ЛОЖЬ , если isFinishing()возвращает истину.

Ответил 05/11/2010 в 03:07
источник пользователем

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