2013-03-17 4 views
0

J'ai ce minuteur à l'intérieur d'un service, il fonctionne parfaitement et compte ... mais quand j'appelle un asyntask, il me donne l'erreur !!Erreur de minuterie lors de l'appel asyntask dans Android

Timer time = new Timer(); // Instantiate Timer Object 
    time.schedule(new TimerTask(){ 
     public void run() { 
       // i call my Asyntasks here 
     } 
    },5000,5000); 

cela me donne l'erreur:

03-17 02:02:27.167: E/AndroidRuntime(925): FATAL EXCEPTION: Timer-0 
03-17 02:02:27.167: E/AndroidRuntime(925): java.lang.ExceptionInInitializerError 
03-17 02:02:27.167: E/AndroidRuntime(925): at  Dic.proj.pkg.notifService$1.run(notifService.java:57) 
    03-17 02:02:27.167: E/AndroidRuntime(925): at java.util.Timer$TimerImpl.run(Timer.java:289) 
    03-17 02:02:27.167: E/AndroidRuntime(925): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.Handler.<init>(Handler.java:121) 
    03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
    03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
    03-17 02:02:27.167: E/AndroidRuntime(925): at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 
    03-17 02:02:27.167: E/AndroidRuntime(925): ... 2 more 

si je mets des instructions d'autres comme Log.d ("message"); tout va bien OK

Répondre

2

AsynchTask doit être créé/appelé à partir d'un thread d'interface utilisateur ou au moins un fil avec un looper pour gérer callbacks lorsque la tâche veut publier quoi que ce soit au fil de l'appelant, comme onPostExcute() ... et en utilisant minuterie objet qui s'exécute dans son propre thread ne satisfait pas cette condition.

Je vous suggère d'utiliser Handler combiné avec minuterie pour y parvenir, ou même créer votre propre horloge en utilisant l'objet de gestionnaire.

La première idée ressemblerait à quelque chose comme ceci:

final Handler handler = new Handler(); 
Timer time = new Timer(); // Instantiate Timer Object 
time.schedule(new TimerTask(){ 
    public void run() { 
      handler.post(new Runnable(){ 
      // i call my Asyntasks here 
      }); 
    } 
},5000,5000); 

Jetez un oeil ici pour en savoir plus sur Handlers et Timers:

Timer

AsynchTask

et est ici un bon tutoriel sur les discussions: Tutorials

+0

Great !!! vous résolvez mon problème :) – Fcoder

1

Il semble que vous devriez être dans l'UI-thread pour démarrer AsyncTasks.

Vous pouvez essayer d'utiliser Handler.postDelayed(Runnale, long) au lieu de Timer.

+0

merci, je l'ai résolu mon problème – Fcoder

1

La classe AsyncTask doit être chargée sur le thread d'interface utilisateur. Ceci est fait automatiquement à partir de JELLY_BEAN.

L'instance de tâche doit être créée sur le thread d'interface utilisateur.

Vous créez un nouveau fil de discussion. Utilisez un gestionnaire. Runs sur le thread principal

private Handler handler = new Handler(); 
Runnable task = new Runnable() { 
@Override 
public void run() { 
    //do something 
    handler.postDelayed(this, 100000); 
} 
}; 
handler.removeCallbacks(task); 
handler.post(task); 

http://developer.android.com/reference/android/os/AsyncTask.html

Questions connexes