Я использую ScheduledExecutorService для воспроизведения тона каждые 2 секунды, когда работает CountDownTimer. Когда CountDownTimer приостановлен или сброшен, мне нужен тональный сигнал, чтобы остановить воспроизведение. Когда CountDownTimer возобновляется, мне нужно, чтобы тональный сигнал воспроизводился после одной и той же 2-секундной задержки.
Вызов тональных сигналов tonegenerator.stop () и tonegenerator.release () останавливает тональный сигнал, когда CountDownTimer находится в режиме паузы, но после возобновлениятон воспроизводится через 1 секунду.
Просматривая SO вопросы и документы, связанные с TimerTask, похоже, что отмена TimerTask работает, но я не уверен, как реализовать это с ToneGenerator. Любая помощь будет принята с благодарностью!
Кнопки
button_set.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
String input = edit_text_input.getText().toString();
if (input.length() == 0) {
Toast.makeText(MainActivity.this, "Fill it in", Toast.LENGTH_SHORT).show();
return;
}
long millisInput = Long.parseLong(input) * 60000;
if (millisInput == 0) {
Toast.makeText(MainActivity.this, "Please enter a positive number", Toast.LENGTH_SHORT).show();
return;
}
setTime(millisInput);
edit_text_input.setText("");
}
});
button_start_pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
if (mTimerRunning) {
pauseTimer();
} else {
startTimer();
beepForTwoSeconds();
}
}
});
button_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
if (mTimerRunning) {
resetTimer();
} else {
resetTimer();
}
}
});
}
ScheduledExecutorService
private final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(5);
public void beepForTwoSeconds() {
final ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_ALARM, 1000);
final Runnable beeper = new Runnable() {
public void run() {
toneGenerator.startTone(AudioManager.STREAM_ALARM, 100);
}
};
final ScheduledFuture<?> beeperHandle =
scheduler.scheduleWithFixedDelay(beeper, 1, 2, SECONDS);
scheduler.schedule(new Runnable() {
public void run() {
beeperHandle.cancel(true);
}
}, 60 * 60, SECONDS);
}
Таймер
public void setTime(long milliseconds) {
mStartTimeInMillis = milliseconds;
resetTimer();
}
public void startTimer() {
mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
countDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
button_start_pause.setText("Start");
button_start_pause.setVisibility(android.view.View.INVISIBLE);
button_reset.setVisibility(android.view.View.VISIBLE);
}
}.start();
mTimerRunning = true;
button_start_pause.setText("Pause");
}
public void pauseTimer() {
countDownTimer.cancel();
mTimerRunning = false;
button_start_pause.setText("Start");
updateCountDownText();
}
public void resetTimer() {
if (mTimerRunning) {
countDownTimer.cancel();
mTimeLeftInMillis = (mStartTimeInMillis + 1000);
updateWatchInterface();
startTimer();
} else {
mTimeLeftInMillis = (mStartTimeInMillis);
updateCountDownText();
updateWatchInterface();
button_reset.setVisibility(android.view.View.VISIBLE);
button_start_pause.setVisibility(android.view.View.VISIBLE);
}
}
public void updateCountDownText() {
int minutes = (int) (mTimeLeftInMillis/1000)/60;
int seconds = (int) (mTimeLeftInMillis/1000)%60;
String timeLeftFormatted = String.format(Locale.getDefault(),
timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds));
text_view_countdown.setText(timeLeftFormatted);
}
public void updateWatchInterface() {
if(mTimerRunning) {
edit_text_input.setVisibility(android.view.View.INVISIBLE);
button_set.setVisibility(android.view.View.INVISIBLE);
button_reset.setVisibility(android.view.View.VISIBLE);
button_start_pause.setText("Pause");
} else {
edit_text_input.setVisibility(android.view.View.VISIBLE);
button_set.setVisibility(android.view.View.VISIBLE);
button_reset.setVisibility(android.view.View.VISIBLE);
button_start_pause.setText("Start");
if(mTimeLeftInMillis <100) {
button_start_pause.setVisibility(android.view.View.INVISIBLE);
} else {
button_start_pause.setVisibility(android.view.View.VISIBLE);
}
}
}
@Override
public void onStop() {
super.onStop();
SharedPreferences preferences = MainActivity.this.getSharedPreferences("prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("startTimeInMillis", mStartTimeInMillis);
editor.putLong("millisLeft", mTimeLeftInMillis);
editor.putBoolean("timerRunning", mTimerRunning);
editor.putLong("endTime", mEndTime);
if (countDownTimer !=null); {
countDownTimer.cancel();
}
}
@Override
public void onStart() {
super.onStart();
SharedPreferences preferences = MainActivity.this.getSharedPreferences("prefs", Context.MODE_PRIVATE);
mStartTimeInMillis = preferences.getLong("startTimeInMillis", 0);
mTimeLeftInMillis = preferences.getLong("millisLeft", mStartTimeInMillis);
mTimerRunning = preferences.getBoolean("timerRunning", false);
updateCountDownText();
updateWatchInterface();
if(mTimerRunning) {
mEndTime = preferences.getLong("endTime", 0);
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
if (mTimeLeftInMillis <0) {
mTimeLeftInMillis = 0;
mTimerRunning = false;
updateCountDownText();
updateWatchInterface();
} else {
startTimer();
}
}
}
}