Запуск фоновой нити каждые X секунд (Android Studio) - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть код, который воспроизводит 5 звуков с задержкой в ​​1 секунду между звуками, и я хочу, чтобы эта часть кода выполнялась каждые 5 секунд (поэтому он будет выполняться подряд, если булева переменная истинна, и когдастановится ложным, когда бег протектора остановлен - у меня есть кнопка для запуска и остановки этого выполнения).Все работает отлично, но проблема в том, что я не могу избавиться от 5-секундной задержки при первом нажатии кнопки, поэтому при первом нажатии звуки начинают звучать только через 5 секунд.Как сделать так, чтобы он запускался сразу и только после того, как первый раз начался прием задержек?

Вот код кнопки onClick:

public void clickHandlerStartTempo(final View view) {
    if (!tempoOn) {
        Toast toast = Toast.makeText(getApplicationContext(), "Start Tempo!", Toast
                .LENGTH_SHORT);
        toast.show();
        tempoOn = true;
        final Handler handler = new Handler();
        final int delay = 5000; //milliseconds

        handler.postDelayed(new Runnable() {
            public void run() {
                if (tempoOn) {
                    runCode(view);
                    handler.postDelayed(this, delay);
                }
            }
        }, delay);
    } else {
        Toast toast = Toast.makeText(getApplicationContext(), "Stop Tempo!", Toast
                .LENGTH_SHORT);
        toast.show();
        tempoOn = false;
    }

}

А вот метод runCode:

public void runCode(View view) {
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            playSound(0);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            for (int i = 0; i < 4; i++) {
                if (tempoOn) {
                    playSound(1);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    return;
                }
            }
        }
    };

    Thread thread = new Thread(runnable);
    Log.i(TAG, "runCode: Thread id = " + thread.getId());
    thread.start();
}

Я новичок в разработке для Android, и любая помощь будет очень признательна.Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Не используйте фактический Threads, если вы действительно не хотите что-то делать из потока пользовательского интерфейса.Большую часть времени вы хотите сохранить все в потоке пользовательского интерфейса.

Для простых повторяющихся задач вы можете легко переназначить класс CountDownTimer.Часто с (почти) бесконечным временем выполнения или Long.MAX_VALUE (292 миллиона лет).Кулак onTick происходит сразу после запуска.

private CountDownTimer mTimer;
private void start() {
    if (mTimer == null) {
        mTimer = new CountDownTimer(Long.MAX_VALUE, 5000) {
            @Override
            public void onTick(long millisUntilFinished) {
                // start a beeping countdown
                new CountDownTimer(5000, 1000) {
                    private int state = 1;
                    @Override
                    public void onTick(long millisUntilFinished) {
                        playSound(state);
                        state = state + 1 % 2;
                    }
                    @Override
                    public void onFinish() {
                        playSound(0);
                    }
                }.start();
            }
            @Override
            public void onFinish() { /* ignore, never happens */ }
        };
        mTimer.start();
    }
}
private void stop() {
    if (mTimer != null) {
        mTimer.cancel();
        mTimer = null;
    }
}
0 голосов
/ 29 сентября 2018

Сначала вам нужно воспроизвести звук без резьбы, после чего вы выполните 5-секундную логическую остановку потока после 4-х отсчетов.

public void onStartPress(){
    playSound();
    someMethod();
}

public void someMethod(){
    Handler uiHandler = new Handler(Looper.getMainLooper());
    uiHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            playSound();
            someMethod();
        }
    },1000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...