0

コードで複数のスレッドとハンドラーを実行しています。

そしてこれは私のハンドラーです

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。どうすればいいですか?

4

2 に答える 2

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);
              }
          }
    }
}
于 2012-10-03T07:42:34.640 に答える
0

グローバル変数を作成すると、パラメーターを自分に渡すことができますRunnable

于 2012-10-11T03:32:51.773 に答える