Я работаю над небольшой игрой для Android, которая обрабатывает рисунок на холсте в рабочем потоке. После завершения игры этот поток должен начать следующее действие, но каким-то образом поток пользовательского интерфейса блокируется запуском новой функции.
Это мои игры Main-Loop:
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
Функция performTick()
обрабатывает логику игры и возвращает null
по окончании игры. draw()
выполняет рендеринг. Обе функции работают идеально - проблема в lose()
, которая ничего не делает, кроме как запускает новую активность:
protected void lose() {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(_context, MainMenu.class);
_context.startActivity(intent);
}
});
}
Когда игра заканчивается, новый Activiy (MainMenu) запускается нормально, но не реагирует ни на какие сенсорные события. Выходных данных LogCat нет, и исключений не возникает. Хуже того, lose()
работает нормально, когда вызывается ДО начала основного цикла.
Я работаю над этим уже несколько дней. Пробовал запускать Activity прямо из рабочего Thread (без использования Handler
в lose()
) и часами копался в интернете - ничего не помогает. Похоже, поток пользовательского интерфейса каким-то образом заблокирован или попал в бесконечный цикл, и я понятия не имею, как это исправить.
Все отлажено на устройстве Nexus 4.
Кстати: MainMenu.onCreate()
работает нормально, когда запускается другим способом.
Пожалуйста, помогите, MA3o