javaのtimerオブジェクトのwait関数を呼ぶと、object not locked by thread before wait()と出てしまう問題

現在作っているBluetoothを使ったゲームでtimerを使っているんですが、
それを一時的にwait状態にして、再度timer処理を実行したく、あるcallbackでwait関数を呼ぶと、

object not locked by thread before wait()

というエラーが出てしまって、waitさせることができませんでした。

全体は以下のような感じです。

public class PeripheralDataTimerTask extends TimerTask {
        @Override
        public synchronized void run() {
            for (int i = 0; i < MAX_PARTICIPANTS; ++i) {
                // 一つでも繋がっていたら
                if (activity.mIsConnected[i]) {
                    notifyConnectedDevice();
                    break;
                }
            }
        }
    }

これを以下のように生成し、実行しています。

if (peripheralTimer == null) {
                    peripheralTimer = new Timer();
                    peripheralDataTimerTask = new PeripheralDataTimerTask();
                    // 第二引数:最初の処理までのミリ秒 第三引数:以降の処理実行の間隔(ミリ秒).
                    peripheralTimer.schedule(peripheralDataTimerTask, PERIPHERAL_START_TIMER_INTERVAL, TIMER_INTERVAL);
                }

中身はgitにあげているBluetoothのサンプルと内容はあまり変わりません。

waitするとlockなんちゃらで実行できないので、一度timerをcancelして、再生成することにしました。

// peripheralタイマー開始初回接続のみ
                if (peripheralTimer == null) {
                    peripheralTimer = new Timer();
                    peripheralDataTimerTask = new PeripheralDataTimerTask();
                    // 第二引数:最初の処理までのミリ秒 第三引数:以降の処理実行の間隔(ミリ秒).
                    peripheralTimer.schedule(peripheralDataTimerTask, PERIPHERAL_START_TIMER_INTERVAL, TIMER_INTERVAL);
                }
                // すぐに送ると、centralが認識しないため、遅らせる必要がある
                else{
                    // cancel
                    peripheralTimer.cancel();
                    peripheralTimer = null;
                    peripheralDataTimerTask.cancel();
                    peripheralDataTimerTask = null;
                    // create again
                    peripheralTimer = new Timer();
                    peripheralDataTimerTask = new PeripheralDataTimerTask();
                    peripheralTimer.schedule(peripheralDataTimerTask, PERIPHERAL_START_TIMER_INTERVAL, TIMER_INTERVAL);
                }

pull request出したら、100%文句つけられるけど、bluetoothにつなぐ時しか呼ばれないし、
早く作るのが優先なので、とりあえず、これでいくことにしました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です