一次初学者的灾难--------runnable的run方法不被调用了

来源:互联网 发布:手机淘宝店铺收藏地址 编辑:程序博客网 时间:2024/05/31 11:03

在学习 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。以后遇到线程不运行的问题,首先要考虑是不是有死循环,当然在一个线程里更新游戏中所有东西的方法,是不是不太好呢?因为 一个地方死掉,整个线程就停了。一个地方 的速度,会影响整人线程,如同一个串联电路。

原创粉丝点击