안드로이드 UI 스레드에서 차단된 새로운 활동
-
20-12-2019 - |
문제
에서 일하고 있어요 작은 안드로이드 게임을 처리하는 캔버스에 그리기 작동하는 스레드가 있습니다.게임이 끝난 후에 이 thread 시작해야 하는 다음 활동,하지만 어떻게든 UI 실 얻을 것으로 보인다 차단하여 시작하는 새로운 기능.
이것은 나의 주요 게임-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)일반적으로 시작하지만에 반응하지 않는 모든 터치합니다.없는 콘텐츠 및 예외가 발생.더 악화 lose()
정상 일할 때 그 전에 호출 메인 루프를 시작합니다.
나는 이 일에 대한 일 now.나를 시작하려고 시도 활동에서 직접 작업 스레드(를 사용하지 않고 Handler
에 lose()
다)및 인터넷 검색을 위한 시간 아무것도 할 수 없습니다.그것처럼 보인다는 UI 스레드가 어떻게든 차단 또는 잡은 무한 루프에서,그리고 나는 아이디어가 있지 않을 해결하는 방법이다.
모든 디버깅에 Nexus4 장치입니다.
Btw: MainMenu.onCreate()
작품은 정상적인 시작할 때 다른 방법이다.
도와주세요, MA3o
해결책
당신의 잠금을 해제하지 않을 경우 캔버스의 경우 문은 사실이다.휴식을 얻을 것이다 당신의 나면서 떠나,캔버스에 잠겨 있습니다.
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
// this line won't be executed whether the if statement above is true
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
의 잠금을 해제해야 내부 if 도(전 또는 후에는 잃()).
다른 팁
대신하는 경우 While(true)
수 While(myVar)
가 myVar
이는 부울 값이 true 이면 게임이 실행해야 한다고 거짓 호출할 때 lose()
귀하의 경우에 당신은 그리는 계속하지만 당신은 필요하지 않았다.