現在作っている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につなぐ時しか呼ばれないし、
早く作るのが優先なので、とりあえず、これでいくことにしました。