我尝试连续制作4张图像的动画,当我收到一条发送广播意图的新GCM消息时切换动画。我将显示前两个代码,以及出了什么问题。基本上在两个命令之间(情况0与情况1),我需要能够停止第一个可运行的,然后启动第二个。我尝试通过设置

isRunning = false;


但这不起作用。我在想,如果我一直坚持下去,也许我会做对的,但是我想知道这样做的正确方法是什么。

public void startAnimatedBackground(Integer num) {
    isRunning = false;
    ImageSwitcher imageSwitcher = null;
    aniIn = AnimationUtils.loadAnimation(this,
            android.R.anim.fade_in);
    aniOut = AnimationUtils.loadAnimation(this,
            android.R.anim.fade_out);

    aniIn.setDuration(500);
    aniOut.setDuration(500);
    switch (num) {
        case 0:
            imageSwitcher = (ImageSwitcher) findViewById(R.id.switcher_accept);
            break;
        case 1:
            imageSwitcher = (ImageSwitcher) findViewById(R.id.switcher_on_way);
            break;
        default:
            break;
    }
    imageSwitcher.setInAnimation(aniIn);
    imageSwitcher.setOutAnimation(aniOut);
    imageSwitcher.setFactory(this);
    imageSwitcher.setImageResource(images[0]);
    isRunning = true;
    final Handler handler = new Handler();
    final ImageSwitcher finalImageSwitcher = imageSwitcher;
    Runnable runnable = new Runnable() {

        @Override
        public void run() {
            if (isRunning) {
                System.out.println("Running.."+finalImageSwitcher+index);
                index++;
                index = index % images.length;
                finalImageSwitcher.setImageResource(images[index]);
                handler.postDelayed(this, interval);
            }
        }
    };
    handler.postDelayed(runnable, interval);

}


这是刚开始时发生的,这是正确的。我得到一个闪烁的图像。


... app:id / switcher_accept} 1
... app:id / switcher_accept} 0
... app:id / switcher_accept} 1
... app:id / switcher_accept} 0
... app:id / switcher_accept} 1


案例2运行之后,运行的过程就是这样。如您所见,两者都在运行,并且没有发生预期的行为。我想要的是第二个(switcher_on_way)像第一个一样运行。我希望我的isRunning = false;代码将使这种情况发生,但事实并非如此。


... app:id / switcher_on_way} 0
... app:id / switcher_accept} 1
... app:id / switcher_on_way} 0
... app:id / switcher_accept} 1
... app:id / switcher_on_way} 0
... app:id / switcher_accept} 1

最佳答案

您的问题出在以下块中:

Runnable runnable = new Runnable() {

    @Override
    public void run() {
        if (isRunning) {
            System.out.println("Running.."+finalImageSwitcher+index);
            ...
            handler.postDelayed(this, interval);
        }
    }
};
handler.postDelayed(runnable, interval);


您试图创建一个循环并通过isRunning变量对其进行控制。但是,问题是当intervalisRunning时在true的中间检查了条件。

1: Start _isRunning=false______Check(isRunning)________Check(isRunning)
2: ___Start _isRunning=false___isRunning=true_______isRunning=true


并且您需要其他方法,例如:创建全局handler而不是本地,然后在开始新动画时取消postDelayed
请参阅:cancelling a handler.postdelayed process

或者您可以使用waitsynchronizednotify

07-24 18:54
查看更多