Тональный сигнал для воспроизведения каждые 2 секунды, если работает таймер - PullRequest
0 голосов
/ 07 октября 2019

Я довольно новичок в программировании, поэтому, пожалуйста, потерпите меня.

У меня есть 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");
        }
    }
...