Я довольно новичок в программировании, поэтому, пожалуйста, потерпите меня.
У меня есть CountDownTimer, который пользователь устанавливает в пользовательское значение в секундах. Пока работает этот таймер, я хочу, чтобы звук воспроизводился каждые 2 секунды. Если таймер не работает, я хочу, чтобы тон прекратился. Как только таймер возобновляется, тональный сигнал возобновляется.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить ScheduledExecutorService воспроизвести тональный сигнал.
Я попытался поместить ScheduledExecutorService в onStart таймера (), метод onTick () и новое действие. Я ознакомился с документацией по java и android, но не могу получить указанный код для работы. Я просмотрел SO ответы и YT, но все еще не могу заставить это работать.
Я попытался создать второй таймер и вызвать ToneGenerator в методе onFinish (), но тон не воспроизводится, когдатаймер достигает 0. Вместо этого, тональный сигнал воспроизводится после сброса таймера к исходному значению.
Фрагмент
public class fragmentdro extends Fragment {
private EditText session_edit_text;
private EditText dro_edit_text;
private TextView session_text_view;
private TextView dro_text_view;
private Button session_start_button;
private Button dro_start_button;
private Button session_reset_button;
private Button dro_reset_button;
private Button session_set_button;
private Button dro_set_button;
private CountDownTimer sessionTimer;
private CountDownTimer droTimer;
private boolean SessionTimerRunning;
private boolean DROTimerRunning;
private long SessionStartTimeInMillis;
private long DROStartTimeInMillis;
private long SessionTimeLeftInMillis = SessionStartTimeInMillis;
private long DROTimeLeftInMillis = DROStartTimeInMillis;
private long SessionEndTime;
private long DROEndTime;
View View;
public View onCreateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container, @NonNull Bundle savedInstanceState) {
View = inflater.inflate(R.layout.dro_fragment, container, false);
session_edit_text = View.findViewById(R.id.session_edit_text);
dro_edit_text = View.findViewById(R.id.dro_edit_text);
session_text_view = View.findViewById(R.id.session_text_view);
dro_text_view = View.findViewById(R.id.dro_text_view);
session_start_button = View.findViewById(R.id.session_start_button);
dro_start_button = View.findViewById(R.id.dro_start_button);
session_reset_button = View.findViewById(R.id.session_reset_button);
dro_reset_button = View.findViewById(R.id.dro_reset_button);
session_set_button = View.findViewById(R.id.session_set_button);
dro_set_button = View.findViewById(R.id.dro_set_button);
Таймер
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(()->{
ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_ALARM, 1000);
toneGenerator.startTone(AudioManager.STREAM_ALARM, 100);
}, 0, 2000L, TimeUnit.MILLISECONDS);
}
public void setSessionTime(long milliseconds) {
SessionStartTimeInMillis = milliseconds;
resetSessionTimer();
}
public void startSessionTimer() {
SessionEndTime = System.currentTimeMillis() + SessionTimeLeftInMillis;
final int[] secondsLeft = {0};
sessionTimer = new CountDownTimer(SessionTimeLeftInMillis, 100) {
@Override
public void onTick(long ms) {
if (Math.round((float)ms/1000.0f) != secondsLeft[0])
{
secondsLeft[0] = (int) (Math.round((float)ms)/1000.0f);
}
SessionTimeLeftInMillis = ms;
updateSessionText();
}
@Override
public void onFinish() {
session_text_view.setText("0");
SessionTimerRunning = false;
session_start_button.setText("Start");
session_start_button.setVisibility(android.view.View.INVISIBLE);
session_reset_button.setVisibility(android.view.View.VISIBLE);
}
}.start();
SessionTimerRunning = true;
session_start_button.setText("Pause");
}
public void pauseSessionTimer() {
sessionTimer.cancel();
droTimer.cancel();
SessionTimerRunning = false;
DROTimerRunning = false;
session_start_button.setText("Start");
updateSessionText();
}
public void resetSessionTimer() {
if (SessionTimerRunning) {
sessionTimer.cancel();
SessionTimeLeftInMillis = (SessionStartTimeInMillis);
updateSessionInterface();
startSessionTimer();
} else {
SessionTimeLeftInMillis = (SessionStartTimeInMillis);
updateSessionText();
updateSessionInterface();
session_reset_button.setVisibility(android.view.View.VISIBLE);
session_start_button.setVisibility(android.view.View.VISIBLE);
}
}
public void updateSessionText() {
int minutes = (int) (SessionTimeLeftInMillis/1000/60);
int seconds = (int) (SessionTimeLeftInMillis/1000)%60;
String timeLeftFormatted = String.format(Locale.getDefault(),
timeLeftFormatted = String.format(Locale.getDefault(), "%2d:%02d", minutes, seconds));
session_text_view.setText(timeLeftFormatted);
}
public void updateSessionInterface() {
if (SessionTimerRunning) {
session_edit_text.setVisibility(android.view.View.INVISIBLE);
session_set_button.setVisibility(android.view.View.INVISIBLE);
session_reset_button.setVisibility(android.view.View.VISIBLE);
session_start_button.setText("Pause");
} else {
session_edit_text.setVisibility(android.view.View.VISIBLE);
session_set_button.setVisibility(android.view.View.VISIBLE);
session_reset_button.setVisibility(android.view.View.VISIBLE);
session_start_button.setText("Start");
}
}