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