Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导致意外变量更改的处理程序postDelay()_Android_Multithreading_Postdelayed - Fatal编程技术网

Android 导致意外变量更改的处理程序postDelay()

Android 导致意外变量更改的处理程序postDelay(),android,multithreading,postdelayed,Android,Multithreading,Postdelayed,我正在制作一个游戏,我正在使用postDelay使动画更流畅。我遇到的一个问题是,如果我执行带有postDelay的方法,该方法操作的变量将不再以意外的方式更改。这会导致奇怪的行为,例如位图绘制不正确 下面是一些麻烦的部分: synchronized private void rotate(int dir) { final int originalAngle = angle; //angle is the suspicious variable

我正在制作一个游戏,我正在使用postDelay使动画更流畅。我遇到的一个问题是,如果我执行带有postDelay的方法,该方法操作的变量将不再以意外的方式更改。这会导致奇怪的行为,例如位图绘制不正确

下面是一些麻烦的部分:

       synchronized private void rotate(int dir) {
            final int originalAngle = angle; //angle is the suspicious variable
            final int steps = 4;

            for (int i = 0; i != steps; i++) {
                smoothAnimateRotate(i, steps, originalAngle, dir);
            }
            finishAnimateRotate(steps);
        }

        private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) {
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    angle = originalAngle + dir*(90*(i+1))/steps;
                    rotateStep();
                }
            }, 100 * (i + 1));
        }


        private void rotateStep() {
            angle = (angle+1800) % 360;
            viewdx = (int) (Math.cos(radify(angle))*(1<<16));
            viewdy = (int) (Math.sin(radify(angle))*(1<<16));
            moveStep();
        }

        private void moveStep() {
            notifyViewerRedraw() ;
            try {
                Thread.currentThread().sleep(25);
            } catch (Exception e) { }
        }

当快速调用rotate时,我认为可变角度不知怎么搞砸了。这在我调用rotate时不会发生,但如果我非常快地调用rotate,角度(假设为0、90、180或270)会更改为45度或其他角度。我不明白为什么测试和调试没有带来丰硕的成果。那个么,我如何确保角度以如此意外的方式得到修改呢

我把它修好了。我在Runnables中放置了一个名为isRunning的布尔值,并将其打开和关闭

synchronized private void rotate(int dir) {
    final int originalAngle = angle;
    final int steps = 4;

    if (!isRunning) {
        for (int i = 0; i != steps; i++) {
            smoothAnimateRotate(i, steps, originalAngle, dir);
        }
        finishAnimateRotate(steps);
    }
}

private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) {
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            isRunning = true;
            angle = originalAngle + dir*(90*(i+1))/steps;
            rotateStep();
        }
    }, 100 * (i + 1));
}

private void finishAnimateRotate(final int steps) {
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            rotateFinish();
            isRunning = false;
        }
    }, 100 * (steps + 1));
}