2010-09-18 17 views
1

J'essaie d'utiliser un service pour effectuer un appel régulier vers mon API. La classe asynchrone que j'utilise pour effectuer des appels HTTP externes renvoie des informations à un gestionnaire qui est passé.Android: instancier un gestionnaire dans un TimerTask au sein d'un service

Une version simplifiée ci-dessous est disponible sur la ligne où le gestionnaire est instancié (sans trace de pile). Une idée pourquoi? Y a-t-il une meilleure façon de le faire?

package com.fred.services; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 

public class NotificationService extends Service { 

    private static final String TAG = "com.fred.services NotificationService"; 

    public long delay = 0; 
    public long period_in_minutes = 10; 
    public long period = 1000*60*period_in_minutes; 

    private Timer timer = null; 
    private TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      Handler h; 
      Log.i(TAG, "now you see it"); 
      h = new Handler(); 
      Log.i(TAG, "now you don't"); 
     } 
    }; 

    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     if (timer == null) startservice(); 
    } 

    private void startservice() { 
     if (timer == null) timer = new Timer(); 
     timer.scheduleAtFixedRate(task, delay, period); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

Répondre

1

Y at-il une meilleure façon que je devrais faire cela?

Utilisez AlarmManager et IntentService. Cela permet à votre code de rester en mémoire sauf pendant les moments où il ajoute réellement de la valeur à l'utilisateur (c'est-à-dire en accédant à votre service Web).

+0

Merci, ce post http://stackoverflow.com/questions/4459058/alarm-manager-example contient un lien vers votre explication et un exemple. –