Ajout d'un délai d'attente aux appels asynchrones en Java
-
21-12-2019 - |
Question
Ce n'est pas uniquement une question Firebase, mais j'utilise Firebase pour publier des publications sur un backend à partir d'Android et l'exécuter 10 fois, une fois par seconde.
Firebase ref = new Firebase(URL);
ref.child("Time").setValue(Currentime());
Cependant, il s'agit d'un appel asynchrone et lorsque je mets une boucle while :
while (time_now < time_start + 10 seconds) {
Firebase ref = new Firebase(URL);
ref.child("Time").setValue(Currentime());
}
Il semble exécuter d'abord la boucle while, puis environ 10 appels Firebase à la fin.Existe-t-il un moyen d'ajouter un délai d'attente afin de forcer l'exécution des appels asynchrones (Firebase) pendant une seconde avant d'appeler le prochain appel asynchrone ?
La solution
Si vous regardez le Exemple Java sur le site Web de Firebase, vous verrez qu'il a un doTransactions
méthode et un onComplete
méthode:
Firebase countRef = new Firebase(URL);
Transaction.Handler handler = new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
// set the new time
...
}
@Override
public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {
if (error != null) {
...
} else {
if (!committed) {
...
} else {
// transaction committed, do next iteration
...
}
...
}
}
});
countRef.runTransaction(handler);
Vous définiriez donc la nouvelle heure dans doTransaction
méthode:
// set the new time
currentData.setValue(time_now);
return Transaction.success(currentData);
Et puis démarrez une itération suivante dans le onComplete
méthode.
// transaction committed, do next iteration
if (time_now < time_start + 10 seconds) {
countRef.runTransaction(handler);
}