web-dev-qa-db-fra.com

Comment faire une pause et reprendre une TimerTask / Timer

J'ai une animation dans mon Android qui fait clignoter différentes couleurs TextView. J'ai utilisé une méthode TimerTask, Timer et Runnable pour l'implémenter. Ce que je dois faire est d'arrêter le thread lorsque un utilisateur quitte l'application pendant cette animation dans onPause () et reprend le thread lorsque l'utilisateur revient à l'application dans onResume (). Voici le code que j'ai implémenté, mais cela ne fonctionne pas (onPause (), et onResume () pieces), et je ne comprends pas pourquoi. J'ai lu quelques autres articles sur des sujets similaires, mais ils ne m'ont pas aidé à comprendre quoi faire dans ma situation. J'ai lu que les TimerTasks sont obsolètes , et je devrais probablement utiliser une méthode ExecutorService; je ne sais pas comment implémenter cette fonction.

   ...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();

}
18
embersofadyingfire

Une fois qu'un TimerTask est annulé, il ne peut plus s'exécuter, vous devez créer une nouvelle instance.

Lisez les détails ici:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutor est recommandé pour le code plus récent, il gère les cas comme les exceptions et les tâches prenant plus de temps que l'intervalle planifié.

Mais pour votre tâche, TimerTask devrait suffire.

12
xy uber.com

Voici comment je l'ai fait. Ajoutez pauseTimer booléen à chaque fois que la pause a lieu (écouteur de bouton peut-être) et ne comptez pas la minuterie si elle est vraie.

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);
}
2
seekingStillness
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;
}
0
Keshav Gera