Подтвердить что ты не робот

Как сделать паузу и возобновить TimerTask/Timer

У меня есть анимация в моем приложении для Android, которая мигает TextView разными цветами. Я использовал метод TimerTask, Timer и Runnable для его реализации. Что мне нужно сделать, это остановить поток, когда пользователь покидает приложение во время этой анимации в onPause() и возобновляет поток, когда пользователь возвращается в приложение в onResume(). Ниже приведен код, который я реализовал, но он не работает (части onPause() и onResume()), и я не понимаю, почему. Я прочитал несколько других сообщений по подобным вопросам, но они не помогли мне выяснить, что делать в моей ситуации. Я прочитал, что TimerTasks устарел, и я должен, вероятно, использовать метод ExecutorService; мне непонятно, как реализовать эту функцию.

   ...timerStep5 = new TimerTask() {

        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
                if (b5) {
                    cashButton2SignalText.setBackgroundColor(Color.RED);
                    cashButton2SignalText.setTextColor(Color.WHITE);
                    b5=false;
                } else {
                    cashButton2SignalText.setBackgroundColor(Color.WHITE);
                    cashButton2SignalText.setTextColor(Color.RED);
                    b5=true;
                }
                }
            });
        }
};

timer5.schedule(timerStep5,250,250);

}

public void onPause(){

    super.onPause();

    timerStep5.cancel();

}

public void onResume(){

    super.onResume();

    timerStep5.run();

}
4b9b3361

Ответ 1

После отмены TimerTask он не может работать снова, вам нужно создать новый экземпляр.

Подробнее читайте здесь:

fooobar.com/questions/282035/...

ScheduledThreadPoolExecutor рекомендуется для более нового кода, он обрабатывает случаи, такие как исключения, и задача занимает больше времени, чем запланированный интервал.

Но для вашей задачи TimerTask должно быть достаточно.

Ответ 2

Вот как я это сделал. Добавьте pauseTimer boolean, где когда-либо происходит пауза (возможно, кнопка-слушатель) и не считайте таймер, если true.

private void timer (){
    Timer timer = new Timer();
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer);
    countTimer = 0;
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    String s_time = String.format("%02d:%02d:%02d",
                            countTimer / 3600,
                            (countTimer % 3600) / 60,
                            countTimer % 60);
                    tv_timer.setText(s_time);
                    if (!pauseTimer) countTimer++;
                }
            });
        }
    }, 1000, 1000);
}

Ответ 3

Timer timer1;
private boolean timerStartFlag = false;
private boolean hiddenVisibleFrg = false;
int timerSize = 0;
int videoTime = 0;


@Override
public void onPause() {
    super.onPause();

    Log.e("keshav", "onPause timer1 " +timer1);
    if (timerSize >0 &&hiddenVisibleFrg){
        timerStartFlag =true;
    }

    if (timer1 != null) {
        this.timer1.cancel();
    }

}

@Override
public void onResume() {
    super.onResume();

    if (timerSize >0 && timerStartFlag && hiddenVisibleFrg) {
        callTimerTask(timerSize);
        timerStartFlag = false;
    }
}

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);

    if (!hidden) {
        Log.e("keshav", "HomeFragment  visible ");

        if (timerSize >0 && timerStartFlag) {
            callTimerTask(timerSize);
            timerStartFlag=false;
        }

        hiddenVisibleFrg=true;

    } else {
        Log.e("keshav", "HomeFragment in visible " +timer1);
        if (timer1 != null) {
            this.timer1.cancel();
        }
        if (timerSize >0){
            timerStartFlag =true;
        }
        hiddenVisibleFrg=false;
    }
}


private void callTimerTask(int size) {
    // TODO Timer for auto sliding
    printLog("callTimerTask size " + size);
    timer1 = new Timer();
    timer1.schedule(new TimerTask() {
        @Override
        public void run() {
            if (getActivity() != null) {
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if (getActivity() == null) {
                            return;
                        }
                        if (count1 < size - 1) {
                            //TODO ADD ME kk
                            count1++;
                        } else {
                            count1 = 0;
                        }
                        if (intro_images != null) {
                            intro_images.setCurrentItem(count1);
                        }
                        videoTime++;
                        Log.e("KeshavTimer", "callTimerTask videoTime " + videoTime);
                    }
                });
            } else {
                printLog("callTimerTask getActivity is null ");
            }
        }
    }, 1000, 1000);
    // TODO  1000, 3000;
}