【问题标题】:Timer task not being performed accurately定时器任务未准确执行
【发布时间】:2011-06-21 15:46:12
【问题描述】:

我正在尝试执行将画布旋转 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 次 一秒钟。

【问题讨论】:

    标签: android timer scheduled-tasks rotation


    【解决方案1】:

    Timer/TimerTask 不应该是精确的,也不应该用于此目的。遵循 2D 游戏开发的秘诀,例如 SDK 中包含的 LunarLander 示例。或者,您可以在 subject 上搜索 StackOverflow 和 find 所有 sortsuseful 帖子。

    【讨论】:

    • 请注意,虽然 LunarLander 示例展示了流畅的 2D 动画,但它在其他方面存在相当大的缺陷。
    【解决方案2】:

    我相信您没有使用 SurfaceView。

    像这样在画布上绘图是为了控制而不是快速渲染(读取 >10fps)

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

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

    【讨论】:

      【解决方案3】:

      invalidate 的调用次数不必等于 onDraw 的调用次数。如果您的计时器在 UI 线程有机会运行之前连续运行两次,那么双重无效最终只会导致一次旋转。考虑放入调试代码来验证对这两个方法的调用次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-29
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多