2011-09-15 2 views
3

Je suis en train de développer un service pour Android, qui doit fonctionner en arrière-plan, en exécutant une fonction toutes les 100 secondes. C'est le code source (exemple)Comment faire une minuterie simple sans nouvelle classe dans Android?

package com.example 

import .... 

public class Servizio extends Service { 

    public IBinder onBind(Intent intent) { 

    } 

    public void onCreate() { 

    } 

    public void onDestroy() { 

    //here put the code that stop the timer cycle 

    } 

    public void onStart(Intent intent, int startid) { 

    //i want to begin here the timercycle that each 100 s call myCycle() 

    } 

    public void myCycle() { 

    //code that i can't move on other class!!! 

    } 

} 

Comment je peux faire ça? Maintenant, le service exécute myCycle() juste une fois, parce que j'ai mis un appel dans onStart().

Répondre

7

Utilisez un Timer avec un TimerTask. Pour exécuter votre méthode toutes les 100 secondes, vous pouvez utiliser ce qui suit dans votre méthode onStart. Sachez que cette méthode crée un nouveau thread.

new Timer().schedule(new TimerTask() { 
    @Override 
    public void run() { 
     myCycle(); 
    } 
}, 0, 100000); 

Vous pouvez également utiliser un android.os.Handler comme décrit dans cet article: Updating the UI from a Timer. C'est mieux qu'un minuteur car il s'exécute dans le thread principal, en évitant les frais généraux d'un second thread.

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

rien comme braconner ma réponse et ne me donnant pas le temps de corriger une faute de frappe ... – JPM

+0

Je n'ai pas "poché" votre réponse. J'avais déjà écrit le mien. Le tien était mauvais de toute façon. – dogbane

+0

Si vous regardez le mien est correct – JPM

1

Je le fais habituellement, si j'ai bien compris, vous vouliez que myCycle s'exécute toutes les 100 secondes.

Timer myTimer = new Timer(); 
myTimer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     myCycle(); 
    } 
}, 0,100000); 
1

Quand j'avais cette question, où je crie à un webservice sur une base périodique ce fut ma solution:

public class MyService extends Service { 
    private Handler mHandler = new Handler(); 
    public static final int ONE_MINUTE = 60000; 
    private Runnable periodicTask = new Runnable() { 
     public void run() { 
      mHandler.postDelayed(periodicTask, 100 * ONE_MINUTE); 
      token = retrieveToken(); 
      callWebService(token); 
     } 
    }; 

j'appelle le postDelayed tôt pour que le retard des doesn d'appel webservice Ne provoquez pas le décalage. Les deux fonctions sont actuellement dans la classe MyService.

MISE À JOUR:

Vous pouvez passer un Runnable à postDelayed comme indiqué ici:

http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable, long)

finale booléennes postDelayed public (Runnable r, long delayMillis)

Depuis : Niveau API 1 provoque l'ajout du runnable r au message queue, à b e fonctionne après la durée spécifiée. Le runnable sera exécuté sur le thread auquel ce gestionnaire est attaché.

De même, mon code ne compilera pas en raison de fonctions manquantes, ceci est montré comme un exemple de ce que l'OP peut faire.

+0

J'aime cette réponse le meilleur – JPM

+0

cela ne compilera pas. Vous devez passer 'this', pas' periodicTask' à 'postDelayed'. – dogbane

+0

@dogbane - J'ai pris ce que j'avais, comme démonstration, et il a compilé. J'ai sorti quelques lignes, mais mon masque périodique est presque intact de ce que j'utilise actuellement. –

Questions connexes