1

我的问题是:我使用 Handler.postDelayed() 在 500 毫秒后运行动画。稍后在代码中我使用 Handler.removeCallbacksAndMessages() 因为有时我想运行另一个动画。问题是有时第一个动画开始但没有完成,我认为这是同步问题。

有没有办法检查是否启动了给 postDelayed() 的 Runnable,在这种情况下取​​消 removeCallbacksAndMessages()?

如果这个 Runnable 中的 run() 被启动,removeCallbacksAndMessages 有什么效果吗?

代码是这样的:

Handler hand = new Handler();
if (counter==2) {
    one = (ImageView) findViewById(img_id);
    two = im;
    hand.postDelayed(new Runnable() {
        public void run() {
    applyAnim(0, 90, one, false);
    applyAnim(0, 90, two, false);
    counter = 0;
        }
    }, 750);
} else (counter == 3) {
    im.setClickable(false);
    hand.removeCallbacksAndMessages(null);
    counter = 1;
    applyScndAnim(0, 90, one, false);
    applyScndAnim(0, 90, two, false);
}
4

1 回答 1

2

每次您发布一些任务或发送一些消息时,这些对象都会添加到队列中。当您调用 removeCallbacksAndMessages 时,此队列将被清除。但是当您调用 removeCallbacksAndMessages 时正在调度的任务或消息(已经从队列中拉出)不会被取消。如果要停止任务,请作为线程执行:

public class DrawableTask implements Runnable{
    private boolean cancel = false;
    private boolean isBeingDispatched = false;
    public void cancel(){
        if (this.isBeingDispatched())
            this.cancel = true;
    }
    public boolean isBeingDispatched(){ return isBeingDispatched;}
    public void run(){
        isBeingDispatched = true;
        while(!cancel){
            //refresh 
        }
        cancel = false;
        isBeingDispatched = false;
    }
}

编辑:

private boolean cancel = false;
private boolean isBeingDispatched = false;

public void cancel(){
    if (this.isBeingDispatched())
        this.cancel = true;
}
public boolean isBeingDispatched(){ return isBeingDispatched;}

public void setHandlers(){
    Handler handler = new Handler(){
        public void handleMessage(Message msg){
             YourClassName.this.cancel = false;
             YourClassName.this.isBeingDispatched = true;
             while(! YourClassName.this.cancel){

                  //refresh
             }
             YourClassName.this.cancel = false;
             YourClassName.this.isBeingDispatched = false;
        }
    };
} 

因此,您可以将此取消选项添加到您的处理程序中。当消息到达时,处理程序将执行此代码,如果在执行期间您调用 cancel() 方法,处理程序将暂停他正在执行的任何操作。

于 2012-06-26T10:46:02.587 回答