postDelayed有时不在Android中运行

时间:2012-10-03 07:40:20

标签: java android multithreading handler

我在我的代码中运行多个线程和Handler。

这是我的处理程序

PrizeRunnable mTempPotionRunnable = new PrizeRunnable(aaa);
handler.postDelayed(mTempPotionRunnable, 4000);

        class PrizeRunnable implements Runnable {
        String type;

        PrizeRunnable(String type) { 
            this.type = type; 
        }

        public void run() {
            synchronized (this) {
                  if(!mIsHandlerStarted){
                      if(type.equals(aaa))
                          // Do something
                      else if(type.equals(bbb))
                          // Do something

                    mIsHandlerStarted = true;
                    handler.removeCallbacks(this);
                  }
              }
        }
    }

但有时它同时运行。

我不知道原因。

已更新

我尝试将其更改为:

handler.postDelayed(mTempPotionRunnable, 4000);

Runnable mTempPotionRunnable = new Runnable() {
@Override
public void run() {
      synchronized (this) {
          if(!mIsHandlerStarted){
                // Do something
                mIsHandlerStarted = true;
                handler.removeCallbacks(mMetalRunnable);
          }
      }
}
};

可能会解决我的问题。我正在测试这种方法。

但是我无法将参数传递给我的Runnable。我该怎么办?

2 个答案:

答案 0 :(得分:1)

我的猜测是因为你正在同步当前的实例:

synchronized (this) {
    ...
}

因此,除非您将相同的实例传递给所有处理程序,否则每个处理程序将使用不同的锁定对象。请尝试静态锁定:

class PrizeRunnable implements Runnable {
    String type;
    private static final Object lock = new Object();

    PrizeRunnable(String type) { 
        this.type = type; 
    }

    public void run() {
        synchronized (lock) {
              if(!mIsHandlerStarted){
                  if(type.equals(aaa))
                      // Do something
                  else if(type.equals(bbb))
                      // Do something

                mIsHandlerStarted = true;
                handler.removeCallbacks(this);
              }
          }
    }
}

答案 1 :(得分:0)

创建全局变量,我可以将参数传递给我的Runnable