Comment faire pour exécuter une tâche asynchrone pour chaque x minutes dans android?
comment faire pour exécuter la tâche asynchrone à l'heure? (Je veux l'exécuter toutes les 2 minutes)
J'ai essayé d'utiliser le post du retard, mais il ne fonctionne pas?
tvData.postDelayed(new Runnable(){
@Override
public void run() {
readWebpage();
}}, 100);
Dans le code ci-dessus readwebpage est la fonction qui appelle la tâche asynchrone pour moi..
Dès maintenant ci-dessous est la méthode que j'utilise
public void onCreate(Bundle savedInstanceState) {
readwebapage();
}
public void readWebpage() {
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute("http://www.google.com");
}
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response1 = "";
response1=read();
//read is my another function which does the real work
response1=read();
super.onPostExecute(response1);
return response1;
}
protected void onPostExecute(String result) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
TextView tvData = (TextView) findViewById(R.id.TextView01);
tvData.setText(result);
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute(new String[] { "http://www.google.com" });
}
}
C'est ce que j'ai mon code et il fonctionne parfaitement bien mais le gros problème que j'draine la batterie?
- "J'ai essayé d'utiliser le post du retard, mais il ne fonctionne pas?" - ce n'est pas d'expliquer quoi que ce soit. Sans plus de code et logcat sortie pour afficher les exceptions, il n'est pas facile de répondre à votre question.
- Posté totalité de mon code ..
- Bien sûr, il draine votre batterie. L'extraction de contenu Web, le sommeil de 100 millisecondes, et chercher de nouveau. Ce qui est mauvais pour votre batterie et peut être très coûteux lorsque votre facture de téléphone mobile est livré dans.
- Aucune des méthodes ci-dessous sont de travail que dois-je faire??Je veux extraire le webcontent toutes les 2 minutes ou 5 minutes..
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le gestionnaire si vous voulez commencer quelque chose de toutes les X secondes. Gestionnaire est bon parce que vous n'avez pas besoin de fil supplémentaire pour en garder une trace lors du déclenchement de l'événement. Voici un court extrait:
Noter que
doSomething
ne devrait pas prendre longtemps (quelque chose comme la mise à jour de la position de lecture audio dans l'INTERFACE utilisateur). Si elle peut éventuellement prendre un certain temps (comme le téléchargement ou le téléchargement sur le web), alors vous devriez utiliserScheduledExecutorService
'sscheduleWithFixedDelay
fonction de la place.doSomething
tâche séparéeAsyncTask
thread, mais la prochaine fois, vous aurezdoSomething
sur le thread de l'INTERFACE utilisateur.Handler
mais pas de PoignéeonCreate
?Utilisation
Handler
etPostDelayed
:postDelayed()
est également une méthode surView
, donc si vous avez un widget qui traînent, vous n'avez pas besoin d'unHandler
pour cela.vous pouvez utiliser TimerTask au lieu de AsyncTask.
ex:
Lorsque le téléphone passe en mode veille, pour économiser la batterie, et il est tout à fait possible de se passer dans les 2 minutes d'intervalle,
Handler.postDelayed()
peut manquer l'heure prévue. Pour ces activités, vous devez utiliserAlarmManager
, obtenir un verrouillage avecPowerManager
pour éviter d'aller dormir en arrière pendant que vous êtes l'exécution de l'AsyncTask.Voir mon post avec le code de l'échantillon ici
Aussi, vous voudrez peut-être lire La Planification De Répéter Les Alarmes
Je suggère d'aller avec
Handler#postDelayed(Runnable)
. Gardez à l'esprit que cette méthode ne fonctionne que lorsque votre application est en cours d'exécution (peut-être en arrière-plan), mais si l'utilisateur ferme manuellement ou simplement Android est à court de mémoire, il va arrêter de travailler et de ne pas être redémarré à nouveau plus tard - pour cela, vous devez utiliser les services.Ce code va attendre 2 minutes, pour exécuter votre code, puis continuer à le faire toutes les 2 minutes. Mais si vous voulez qu'il fonctionne instantanément pour la première fois - et puis démarrer l'attente en boucle, au lieu d'utilisation:
ou, si votre code est plus que juste une méthode (
readWebsite()
dans ce cas), et vous ne voulez pas que d'être dupliqué:(^ c'est exactement comme le premier exemple mais a un 0ms délai avant la première exécution au lieu de 2 minutes)
(Cette réponse est fondée sur @Devashish Mamgain est un, mais j'ai ajouté trop de détails pour un montage donc j'ai dû ajouter un nouveau)
Essayer l'extension de la
Thread
classe, définissez un temps de sommeil de 2000 millis et le lieu de votre appel dans lerun
méthode. Cela devrait le faire.Exécuter plusieurs messages(Runnables) puis il faut utiliser la fonction Looper classe qui est responsable de la création d'une file d'attente dans le fil. Par exemple, lors de l'écriture d'une application qui télécharge des fichiers à partir d'internet, nous pouvons utiliser de l'Arpenteuse de la classe pour mettre des fichiers en téléchargement dans la file d'attente. Cela vous aidera à effectuer la tâche asynchrone dans android...
Vous pouvez utiliser le Temps avec le Gestionnaire et TimerTask
Vous pouvez vérifier logcat pour vérifier si est en cours d'exécution ou non à l'aide de "contrôle" du nom de la balise
Vous pouvez exécuter une boucle dans le
AsyncTask
qui dort pendant deux secondes entre les tâches. Quelque chose comme ceci: