【一次初学者的灾难--------runnable的run方法不被调用了】在学习 android 编程的菜鸟道路上,出现了 一次大灾难
public void run() {
while (gameloop) {
Log.d("update", "free mem (Main)=" + Runtime.getRuntime().freeMemory());
if (System.currentTimeMillis() - time > 200) {
Log.d("update","GameView.run()");
synchronized (holder) {
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
canvas.drawRGB(0, 0, 0);
curScene.update(canvas);
// holder.unlockCanvasAndPost(canvas);
time = System.currentTimeMillis();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
}
}
}
}
这代码,看上去没有任何 问题。在curScene.update()里更新场景中的一切,包括动作和动画/
但是有那么一天,突然游戏里的动画更新不了了。查到最后,发现run()方法,只被调用一两次就再也不被调用了,导致地图和玩家的图片更新不了。
于是,我首先开始怀疑是不是java把我的内存给回收了(日志里也有垃圾被回收的提示,我也用了大量的静态变量和单例,所以对内存有点担心)。但是 我发现,我的玩家的坐标数据是可以被修改的,也就是我的移动操作,玩家是移动了的,只是不能在画面上展示出来。这可能也是因为 长期做C++,做java时,内存不能控制在自己手里,有些不放心造成的。
然后,我又开始想,是不是这个线程被阻塞了,到网上搜,也找不到好的资料(其实线程阻塞这个答案已经接近真相了),没有搜到什么资料。
最后,朋友一句话点醒了我“是不是有死循环”!!!于是我挨个注释各个模块(这个方法早就该用了)最后发现是怪物的部分出了问题。然后仔细一看,发现怪的寻路是个死循环,即向四方向找路,直到找到为止。而如果是四方向都没有路(被别的怪卡在里面),就一直死循环。最后导致整个线程的卡住 。
哈哈,终于解决了。
有两点要注意。
1。实在找不到问题,可以依次注释各个模块,看是哪个模块出了问题,慢慢细化找到病灶。
2。出了问题,首先不要想系统出了什么 问题,那也是不好调的。而且系统级的东西,出错的概率还是小的。
3。以后遇到线程不运行的问题,首先要考虑是不是有死循环,当然在一个线程里更新游戏中所有东西的方法,是不是不太好呢?因为 一个地方死掉,整个线程就停了。一个地方 的速度,会影响整人线程,如同一个串联电路。