Comment boucler un service?
Mon service a besoin de vérifier quelque chose de chaque minute et
while(true)
{
Thread.sleep(60000)
//REST OF CODE HERE//
}
ne fonctionne pas. La présentation de la demande de gel et de me demander de force de l'arrêter.
Je suis sûr que le problème est avec la boucle while, mais je pensais que c'était la seule façon de répéter à l'infini les service quand les onStart() la méthode s'exécute.
Toutes les suggestions sont les bienvenues.
MODIFIER
Je le fixe et dans le cas où vous vous demandez comment le code ressemble bien là vous allez:
@Override
public void onStart(Intent intent, int startId) {
//TODO Auto-generated method stub
super.onStart(intent, startId);
Toast.makeText(this, "Service running", Toast.LENGTH_SHORT).show();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//TODO Auto-generated method stub
super.handleMessage(msg);
Toast.makeText(protectionService.this, "5 secs has passed", Toast.LENGTH_SHORT).show();
}
};
new Thread(new Runnable(){
public void run() {
//TODO Auto-generated method stub
while(true)
{
try {
Thread.sleep(5000);
handler.sendEmptyMessage(0);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
Fondamentalement, le service est appelé et les tâches de ce service sera répété toutes les 5 secondes dans ce cas.
Je tiens à remercier vineetska, Janusz et inazaruk pour ce qui suggère d'utiliser des Gestionnaires. Je tiens à remercier tous ceux qui ont répondu ainsi, votre aide a été très apprécié.
OriginalL'auteur Batzi | 2011-08-19
Vous devez vous connecter pour publier un commentaire.
créer un thread dans votre service, et mettre tout en boucle comme ceci:
Je l'ai essayé, c'est de sortir et de le LogCat états: FATAL EXCEPTION: Thread-11 java.lang.RuntimeException: ne Peut pas créer de gestionnaire à l'intérieur de thread qui n'a pas appelé Looper.préparer() à android.os.Gestionnaire d'.<init>(Handler.java:121) à android.widget de.Toast.<init>(Toast.java:68) à android.widget de.Toast.makeText(Toast.java:231) au com.exemple.test.protectionService$1.exécuter(protectionService.java:72)à java.lang.Fil de discussion.exécution(Thread.java:1019)
vous êtes à l'aide de toast dans ce thread....Si vous voulez faire une INTERFACE utilisateur liées à la tâche, puis créer un gestionnaire et l'appeler à partir du fil..Chaque UI liées à la tâche devrait être fait dans le thread de l'INTERFACE utilisateur.
Ouais c'est ça. Elle fonctionne parfaitement bien. Merci beaucoup frère.
J'ai ré-édité mon post original. Check it out.
OriginalL'auteur
Chaque du cycle de vie de la méthode de service est appelé à partir de l'UI thread. Si vous avez besoin d'tâche d'arrière-plan à l'exécution de tous les temps, vous pouvez créer nouveau fil de discussion pour cela. C'est effectivement très bien décrite dans la documentation.
Dans votre cas, cependant, vous devriez envisager d'utiliser
AlarmManager
à la place. Il gère les événements récurrents très bien et a été spécialement conçu pour les scénarios similaires.Une autre solution serait d'utiliser
Handler
et sespostDelayed()
fonction. Ceci peut être utilisé lorsque votre opération (qui doit être exécuté chaque années 60) n'est pas de temps (ou sinon vous devez toujours exécuter dans le thread d'arrière-plan).Dans l'ensemble, la création d'un thread qui dort tout le temps n'est pas une bonne solution pour les appareils mobiles. Cela consomme des ressources qui pourraient avoir été passé pour quelque chose de plus utile. Surtout en considérant un riche ensemble de fonctionnalités d'Android pour les événements récurrents.
OriginalL'auteur
Un service lui-même n'est pas un subthread. Cela signifie que chaque code qui s'exécute dans votre service sera exécuté sur-le-main Thread d'INTERFACE utilisateur. Vous avez besoin pour démarrer un Thread, ou l'utilisation d'un AsyncTask à votre service pour déplacer le calcul de l'arrière-plan.
Ont un look à la la documentation de service pour plus d'informations.
Si vous voulez répéter une portion de code à chaque minute, vous pouvez utiliser un gestionnaire.
Un gestionnaire a une méthode appelée postDelayed cette option permet de définir un délai après lequel un exécutable sera exécuté. Il suffit d'appeler la méthode de nouveau à la fin de votre exécutable à nouveau le code au bout d'une minute.
OriginalL'auteur
Services à exécuter sur le thread principal. Si vous voulez décharger le traitement, vous devez démarrer un thread séparé. Jetez un oeil à IntentService, il le fait par défaut. Sur une autre note, ayant une infinité de service en cours d'exécution avec sleep() peut ne pas être une bonne idée. Pour le traitement planifié, vous pouvez utiliser AlarmManager.
OriginalL'auteur
Que Janusz écrit, vous pouvez utiliser le gestionnaire de post en retard. Voici un exemple:
De poster exécutable, puis l'envoyer encore et encore après
DELAYED_TIME
.OriginalL'auteur