我的CountDownTimer存在问题。情况如下: 在游戏上工作,我没有使用框架(谁需要一个,对吧?咳嗽)我运行了CountDownTimer。此CountDownTimer用于计算玩家必须完成一个级别的时间,并且还会每100毫秒勾选一次更新屏幕。
在第一级,这可以正常工作,但在第二级,它每50ms滴答一次,在第三级每60/90 / 50ms滴答(是的,按顺序重复)使游戏表现得很糟糕并且搞乱了碰撞。 我不知道这里发生了什么。
我已经排除了它是否依赖于水平,首先加载后来的水平,并且一旦解决了这些问题就会产生相同的问题。 但是,我已经确定了它出错的地方:在装载新级别时,只有这样;即使重新加载当前级别也不会带来这个错误。
我怀疑在这段代码中有些东西是不应该的:
public void prepareNewLevel(){
RelativeLayout rl = (RelativeLayout)findViewById(R.id.game);
level.clear();
movables.clear();
img_move.clear();
img_noMove.clear();
timerCount.cancel();
totalSolved = 0;
solvable = 0;
levelWidth = 0;
levelHeight = 0;
allCollided = false;
firstDraw = true;
rl.removeAllViewsInLayout();
}
级别,movings,img_move和img_noMove 是列表项。
这是我的计时器:
MyCount update = new MyCount(15*1000, 100);
这是MyCount:
public class MyCount extends CountDownTimer{
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
remaining_time = millisUntilFinished;
if(!loadingNewLevel)
MoveObjects();
}
@Override
public void onFinish() {
resetLevel = true;
upMotion = false;
downMotion = false;
leftMotion = false;
rightMotion = false;
update.start();
}
}
然后我还在 loadLevel()函数的末尾调用 update.start()。我首先想到我有两个定时器同时运行,但写入LogCat显示我是假的,因为我每隔15秒就得到一条整齐的“重置”消息,而不是在15秒以内的多个时刻。
这基本上就是问题所在。既然我知道它在哪里以及问题是什么,我该如何解决呢?
-Zubaja
答案 0 :(得分:1)
尝试使用Timer而不是CountDownTimer:
// start timer inside your method
if( timer != null) timer.cancel();
timer = new Timer();
timer.scheduleAtFixedRate( new TimerTask()
{
@Override
public void run()
{
handler.obtainMessage( yourInegerMessage).sendToTarget();
}
}, 100, 15000);
// and define you handler
public Handler handler = new Handler( new Handler.Callback()
{
@Override
public boolean handleMessage( Message message)
{
// use 'message.what' as yourInegerMessage
// ...
return true;
}
});
// and stop your timer after first time
可能会帮助你。
答案 1 :(得分:0)
可能是你开始更多的CountDownTimer?尝试在启动新的CountDownTimer之前停止现有的CountDownTimer。