我正在尝试为Android制作游戏。它基于2D地图,用户可以在屏幕上移动。屏幕上有几个按钮,例如“Shop”。当我用户按下按钮时,我想用界面填充屏幕。
到目前为止,我的方法如下:
我有一个mapView和一个地图线程
public class MapView extends SurfaceView implements SurfaceHolder.Callback {}
public class MapThread extends Thread { ... }
地图线程定期调用MapView中的onDraw
方法,该方法将地图绘制到屏幕上,而MapView
中的事件侦听器则处理移动地图。
对于商店,我有类似的设置,ShopThread
和ShopView
。按下商店按钮后,我的想法是停止MapThread
,然后启动ShopThread
。这意味着只会调用ShopView
的'onDraw'方法,允许我绘制商店界面。
在按下按钮时,我有以下代码:
(我通过变量topPage
)
mapThread.isRunning = false; //stop the map thread
setVisibility(INVISIBLE);
// add showView to the activity and start the ShopThread
topPage.addContentView(shopView,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT) );
shopView.startThread();
我的问题是,当试图访问商店时,游戏冻结了一段时间。屏幕保持黑色,大约30秒到一分钟没有响应。我还会从操作系统中收到“强制关闭”或“等待”错误消息。如果我按下等待,ShopView将偶尔开始正常工作。
我已将其缩小到我的ShopThread
课程中的run方法。
public void run() {
Canvas c;
while (isRunning){
c = null;
try {
c = ShopView.getHolder().lockCanvas(null);
synchronized (ShopView.getHolder()) {
if(c != null)
ShopView.onDraw(c);
}
} finally {
if( c != null){
ShopView.getHolder().unlockCanvasAndPost(c);
}
}
}
}
行c = ShopView.getHolder().lockCanvas(null);
只是返回null。我已将Log.v语句放在其他updateThreads中,它们似乎已全部停止。是什么在画布上保持锁定,是否有我遗漏的东西?
答案 0 :(得分:0)
我发现了问题。我设法解决了这个问题,但我不确定为什么首先出现问题。
我最初在ShopView
课程中创建了一个MapView
对象,并在我想开始将商店绘制到画布时手动启动ShopThread
。而不是这样,我改变了它,以便在surfaceCreated()
函数