Aller au contenu

KeyDispatchingTimedOut ANR


enzostar

Recommended Posts

Bonjour,

je développe une application Android dans laquelle j'aimerais implémenter un compte à rebours.

Pour ce faire, j'utilise la classe CountDownTimer que j'essaie de customizer en mettant en pause par exemple le compteur via un bouton.

Voici le code qui pourra peut être vous éclairer d'avantage sur cette erreur qui se produit entre laligne 68 et 82


package com.poker;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CountDown extends Activity implements OnClickListener {

private TextView tv;
private MyCount counter;
private Button pause;
private Button play;


@Override
public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 LinearLayout layout = new LinearLayout(this);
 layout.setOrientation(LinearLayout.VERTICAL);
 tv = new TextView(this);

 pause = new Button(this);
 pause.setText("pause");
 pause.setOnClickListener(this);

 play = new Button(this);
 play.setText("play");
 play.setOnClickListener(this);

 layout.addView(tv);
 layout.addView(pause);
 layout.addView(play);
 this.setContentView(layout);

 counter = new MyCount(5000, 1000);

 counter.start();

}


public class MyCount extends CountDownTimer {

 public MyCount(long millisInFuture, long countDownInterval) {
  super(millisInFuture, countDownInterval);
 }

 @Override
 public void onFinish() {
  tv.setText("done!");
 }

 @Override
 public void onTick(long millisUntilFinished) {
  tv.setText("Left: " + millisUntilFinished / 1000);

 }

}

@Override
public void onClick(View v) {
 if (v==pause) {
   try {
 synchronized (counter) {
  changeButtons();
  counter.wait();
   }

  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }else {
  notifyAll();
 }
}

private void changeButtons(){
 pause.setClickable(false);
 play.setClickable(true);
}
}

Merci pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

d'après ce que j'ai pu lire de la documentation, un thread bloque toute l'UI.

Comment créer un thread qui ne bloque pas l'UI ?

J'aimerais pouvoir mettre en pause le thread qui réalise le compte à rebours sans bloquer l'interface utilisateur

les lignes 68 à 82 correspondent à ça

public void onClick(View v) {
 if (v==pause) {
   try {
 synchronized (counter) {
  changeButtons();
  counter.wait();
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }else {
  synchronized (counter) {
   counter.notify();
  }
 }
}

Lien vers le commentaire
Partager sur d’autres sites

CountDownTimer n'est pas prévu pour être mis en pause; ton utilisation de wait() ne fait que bloquer le thread UI, avec pour conséquence le message d'erreur que tu as.

Pour ton besoin, je pense qu'il faut que tu implémentes toi-même un compteur qui ait cette fonctionnalité de mise en pause; tu peux t'appuyer sur AsyncTask pour la mise en oeuvre, ça doit être faisable assez facilement

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...