Использование ScheduledExecutorService для запуска и остановки ToneGenerator, связанного с таймером - PullRequest
0 голосов
/ 09 октября 2019

Я использую 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();
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...