Android UI 线程在新 Activity 中被阻塞
-
20-12-2019 - |
题
我正在开发一个小型 Android 游戏,它可以在工作线程上处理画布绘制。游戏结束后,该线程应该启动下一个活动,但不知何故,UI 线程似乎因启动新函数而被阻塞。
这是我的游戏主循环:
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()
, ,它只是启动一个新的 Activity:
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);
}
});
}
当游戏结束时,新的 Activity(MainMenu)正常启动,但不会对任何触摸事件做出反应。没有LogCat输出,也没有发生异常。更糟糕, lose()
在主循环开始之前调用时工作正常。
我已经为此工作好几天了。我尝试直接从工作线程启动活动(不使用 Handler
在 lose()
)并在互联网上搜索了几个小时 - 没有任何帮助。UI 线程似乎被某种方式阻塞或陷入无限循环,我不知道如何解决这个问题。
一切都在 Nexus 4 设备上进行调试。
顺便提一句: MainMenu.onCreate()
以其他方式启动时工作正常。
请帮忙,ma3o
解决方案
当 if 语句为 true 时,您不会解锁画布。休息会让你摆脱这段时间,让画布保持锁定状态。
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 语句内解锁(在 Lose() 之前或之后)。
其他提示
相反,如果 While(true)
你可以有 While(myVar)
在哪里 myVar
是一个布尔值,当游戏应该运行时为 true,当您调用时设置为 false lose()
在你的情况下,你继续画画,尽管你不需要。
不隶属于 StackOverflow