一次初学者的灾难--------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。以后遇到线程不运行的问题,首先要考虑是不是有死循环,当然在一个线程里更新游戏中所有东西的方法,是不是不太好呢?因为 一个地方死掉,整个线程就停了。一个地方 的速度,会影响整人线程,如同一个串联电路。
- 一次初学者的灾难--------runnable的run方法不被调用了
- java多线程调用run和不调用run的区别
- Java中thread的run()/start()方法以及Runnable接口
- 一次灾难恢复的真实记录
- docker run 一次执行多条命令的方法
- 学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
- Java实例 定义任务的一个发射小程序 实现Runnable接口并编写run()方法
- 学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
- 自定义view的时候,执行了invalidate()方法后 onDraw()不被调用的解决方法
- C++函数调用的完美灾难
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- 关于Android中调用了post方法后貌似没有执行run方法的解释及解决办法
- 关于Android中调用了post方法后貌似没有执行run方法的解释及解决办法
- oracle数据文件被误删除后的灾难处理方法
- oracle数据文件被误删除后的灾难处理方法
- oracle数据文件被误删除后的灾难处理方法
- oracle数据文件被误删除后的灾难处理方法
- 2012的全球灾难 已被证实希望这不是真的就看半个月后唐山会不会地震了【不晓得是不是真的】
- 代码覆盖从简到繁 (四) – 为代码签入把门儿
- 观察者模式(Observer)
- 昨天,今天,明天
- lite源码阅读(五)最终的核心
- JBoss AS7 用户指南
- 一次初学者的灾难--------runnable的run方法不被调用了
- C# Application.DoEvents() 处理队列消息,防界面假死。
- 第一个单片机程序-----流水灯
- 英特尔称竞争对手不是ARM而是高通
- ACM题目分类
- Spring与Hibernate集成_声明式事务
- Visual C++开发工具与调试技巧全面总结
- J2ME添加自定义图标
- Android Google map使用