Возврат в SurfaceView после того, как фокус был снят - PullRequest
3 голосов
/ 08 октября 2010

Я работаю над RPG для Android, используя демонстрацию API LunarLander.Я уже сделал игру, используя это демо (Porcupine Assassin, зацените!), Так что я хорошо понимаю класс Canvas и тому подобные вещи.

Моя проблема в том, что в RPG вынужен способ доступа к инвентарю, статистике и т. д. Поэтому я установил кнопку НАЗАД, чтобы запустить класс Inventory.java.У меня возникают проблемы, когда я завершаю () действие Инвентаризация и пытаюсь вернуться в игру (SurfaceView).

Это обратный вызов SurfaceCreated ():

public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

Iполучал FC, вызванный «IllegalThreadStateException: поток уже запущен», поэтому я добавил try / catch в обратный вызов SurfaceCreated ().С try / catch не происходит FC, но я возвращаюсь к черному экрану.

Я попытался взять try / catch и добавить проверку в начале: if (! Thread.isAlive ()).Таким образом, если поток уже запущен, он ничего не сделает.Как ни странно, я получил тот же FC «поток уже запущен», поэтому thread.isAlive () должен был вернуть false .. ??

У меня также есть метод onWindowFocusChanged () из API:

@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (!hasWindowFocus) thread.pause();
    else thread.setState(STATE_RUNNING);
}

Я очень заинтересован в игровой стороне, у меня есть большая часть основы для моей RPG.Но это все, что связано с Android / Java, которые у меня над головой.Кто-нибудь может указать мне правильное направление?

1 Ответ

4 голосов
/ 09 октября 2010

Это потому, что вы пытаетесь перезапустить завершенный поток, поэтому .IsAlive () вернул false. Существует много документации по этой проблеме, если вы столкнулись с ошибкой Google LunarLander, нелегальным потоком или чем-то еще.

Один возможный обходной путь, который я нашел один раз, был таким:

    public void surfaceCreated(SurfaceHolder holder) {
        if (thread.getState() == Thread.State.TERMINATED) {
            thread = new CascadeThread(getHolder(), getContext(), getHandler());
            thread.setRunning(true);
            thread.start();
        }
        else {
            thread.setRunning(true);
            thread.start();
        }

Вы можете найти полную документацию здесь

...