计时器任务未正确执行

时间:2011-02-04 21:47:09

标签: android timer scheduled-tasks rotation

我正在尝试执行20次旋转画布的基本任务 第二个使用计时器但它似乎没有正常工作和它 滞后。例如,如果我每50毫秒旋转矩形0.3度 应该在第二个旋转6度,但事实并非如此。它 轮换真的很慢。这是我的示例代码:

//Code for update task
class UpdateTimeTask extends TimerTask {

      public void run() {
              hndView.post(new Runnable() {
                   public void run() {
                           hndView.invalidate(); //this code invalidates custom view that calls onDraw to draw rotated hand
                   }
                 });
      }
}


//Code for onDraw method of custom view that needs to be update
@Override 
protected void onDraw(Canvas canvas){

    super.onDraw(canvas);

    //ang is angle to rotate and inc is float value of 0.3 degree to be incremented
    ang = ang + inc;
    if (ang >= 360) ang = ang - 360;
    canvas.rotate(ang, canvas.getWidth()/2, canvas.getHeight()/2);  
    canvas.drawRect((canvas.getWidth()/2 - 2), (canvas.getHeight()/2 - 125), (canvas.getWidth()/2 + 2), (canvas.getHeight()/2 + 10), mTextPaint);
    canvas.restore();

}

//code to schedule task
Timer timer = new Timer();
UpdateTimeTask tt = new UpdateTimeTask();
timer.schedule(tt, 0, 50);

任何人都可以告诉我这里我做错了什么?我应该用吗 执行此任务的方法不同?因为很难相信 你不能简单地将矩形平滑旋转20次 一秒钟。

3 个答案:

答案 0 :(得分:2)

Timer / TimerTask不应该是精确的,不应该用于此目的。遵循2D游戏开发的配方,例如SDK中包含的LunarLander示例。或者,您可以在find上搜索StackOverflow和sorts usefulsubject个帖子。

答案 1 :(得分:1)

我相信你没有使用SurfaceView。

画布就像画布那样用于控制而不是快速渲染(读取> 10fps)

如果你想要性能,你需要使用SurfaceView,你平均25-30 fps或者opengl

请阅读:http://developer.android.com/guide/topics/graphics/index.html

答案 2 :(得分:0)

对invalidate的调用次数不必等于对onDraw的调用次数。如果您的计时器在UI线程有机会运行之前最终连续运行两次,则双重无效将最终仅导致单次轮换。考虑输入调试代码来验证对这两种方法的调用次数。