Вот моя ситуация: Я создаю игру для андроида, и действие моей игры состоит из пользовательского surfaceView, который имеет поток для игровой логики и рендеринга. Архитектура подобна демонстрации LunarLander с веб-сайта Google.
Когда действие запускается, оно создает surfaceView и называет этот метод:
@Override
public void surfaceCreated(SurfaceHolder holder)
{
renderThread.start();
}
Когда я нажимаю кнопку "Домой" для выхода из игры, onPause (), метод называют, который называет surfaceDestroyed (). В surfaceDestroyed я останавливаю игровой Поток путем вызова:
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
synchronized(holder)
{
renderThread.stop();
}
}
Приложение переходит к прекрасному фону. Затем когда я повторно запускаю приложение путем нажатия значка, я добираюсь, "Поток уже запустил" сообщение в журнале наряду с "силой близко" всплывающее окно на экране. Это сообщение происходит, когда действие вводит "surfaceCreated" метод, когда это звонит, запускаются () на потоке рендеринга.
Теперь я изучал его в течение многих часов и не могу выяснить, почему это. Я полагаю, что мой поток останавливается, когда я закрываю приложение, таким образом, я не понимаю, почему это говорит, что уже запустилось.
Эти методы делают не то, что вы думаете. Из API doc:
Никогда не законно начинать поток более одного раза.
И:
public final void stop()
- Исправлено. Этот метод по своей сути небезопасен.
Если вы хотите приостановить поток, вы должны использовать Object.wait()
и Objecft.notifyAll()
изнутри потока.