Je dois exécuter du code à intervalles réguliers (me connecter à un serveur et extraire des données de la base de données MySQL toutes les minutes). Pour cela, j'ai une classe Sync:
public class Sync {
static private Handler handler = new Handler();
Runnable task;
public Sync(Runnable task, long time) {
this.task = task;
handler.removeCallbacks(task);
handler.postDelayed(task, time);
}
}
et dans mon activité j'ai:
public void onCreate(Bundle savedInstanceState) {
...
Sync sync = new Sync(call,60*1000);
...
}
final private Runnable call = new Runnable() {
public void run() {
//This is where my sync code will be, but for testing purposes I only have a Log statement
Log.v("test","this will run every minute");
}
};
J'ai essayé cela avec une période de test plus courte, mais cela ne fonctionne qu'une fois. Lorsqu'il enregistre le message pour la première fois, c'est aussi le dernier. Est-ce que quelqu'un voit ce que je fais depuis longtemps? Merci!
Vous pouvez le faire en utilisant le code ci-dessous, J'espère que cela vous aidera!
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
try{
//do your code here
}
catch (Exception e) {
// TODO: handle exception
}
finally{
//also call the same runnable to call it at regular interval
handler.postDelayed(this, 1000);
}
}
};
//runnable must be execute once
handler.post(runnable);
D'abord, vous devez déclarer le gestionnaire globalement Deuxièmement, vous devez utiliser la méthode post Delay à nouveau dans runnable pour la déclencher à nouveau.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Sync sync = new Sync(call,60*1000);
}
final private Runnable call = new Runnable() {
public void run() {
//This is where my sync code will be, but for testing purposes I only have a Log statement
Log.v("test","this will run every minute");
handler.postDelayed(call,60*1000);
}
};
public final Handler handler = new Handler();
public class Sync {
Runnable task;
public Sync(Runnable task, long time) {
this.task = task;
handler.removeCallbacks(task);
handler.postDelayed(task, time);
}
}
}
handler.postDelayed(task, time);
ne sera exécuté qu'une fois, si vous voulez que le code se déclenche à intervalles réguliers, je suggérerais une Timer
et une TimerTask
au lieu d'une Handler
et une Runnable
.
TimerTasks
peut être configuré pour s'exécuter une fois, toutes les x secondes ou avec une période fixe, par ex. x secondes - quelle que soit la durée de la dernière exécution.
private void doSomethingRepeatedly() {
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {
try{
//Your code
}
catch (Exception e) {
// TODO: handle exception
}
}
}, 0, 10000);
}
Une autre manière, en utilisant scheduleAtFixedRate :
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void beepEvery10Seconds() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 0, 10, SECONDS);
}