【发布时间】:2014-06-03 06:02:11
【问题描述】:
我正在开发一个在工作线程上处理画布绘图的小型 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);
}
});
}
当游戏结束时,新的 Activiy (MainMenu) 正常启动,但不会对任何触摸事件做出反应。没有 LogCat 输出,也没有发生异常。更糟糕的是,lose() 在主循环开始之前被调用时正常工作。
我已经为此工作了好几天了。我尝试直接从工作线程启动活动(不使用lose() 中的Handler)并在互联网上搜索了几个小时 - 没有任何帮助。似乎 UI 线程以某种方式被阻塞或陷入无限循环,我不知道如何解决这个问题。
一切都在 Nexus 4 设备上调试。
顺便说一句:MainMenu.onCreate() 在以其他方式启动时正常工作。
请帮忙, MA3o
【问题讨论】:
标签: android multithreading ui-thread blocked