attendre jusqu'à ce que firebase récupère les données
Je veux construire une méthode qui retourne un child
valeur dans FireBase
. J'ai essayé de faire quelque chose comme ceci:
public String getMessage(){
root.child("MessagesOnLaunch").child("Message").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
message = (String) dataSnapshot.getValue();
Log.i("4r398", "work");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
Log.e("error", firebaseError.getMessage());
}
});
return message;
}
Le problème est que la méthode renvoie null
c'est probablement parce que la méthode n'attendez pas jusqu'à ce que l'auditeur de finitions et de retour null
parce que ses la valeur par défaut de message
.
Comment puis-je faire de cette méthode attendre jusqu'à ce que l'auditeur se produit et puis retourner la valeur.
assumer la racine est stocké sur la classe et la classe n'est pas gc ed), il ne devrait pas question que la fonction est terminée
Vous ne pouvez pas synchrone retour asynchrone valeur. Le
l'Utilisation de cette Réponse. J'ai rencontré le même problème et l'a résolu en utilisant EventBus.
Vous ne pouvez pas synchrone retour asynchrone valeur. Le
message
variable ici est totalement inutile, car il ne va pas être définies à la fois, il retourne--les données doivent être récupérées à partir du serveur en premier. Au lieu de cela, getMessage() doit accepter un rappel de certains de tri ou le déclenchement d'un événement. Il y a un guide dédié à ces concepts, calées plein d'exemples et de conseils.l'Utilisation de cette Réponse. J'ai rencontré le même problème et l'a résolu en utilisant EventBus.
OriginalL'auteur ben | 2015-06-05
Vous devez vous connecter pour publier un commentaire.
Faire une interface
Déclarer les éléments suivants de la fonction readData()
Appeler le readData() comme suit
readData() peut être appelée à l'intérieur de votre méthode getMessage() ou même à l'intérieur onCreate()
OriginalL'auteur Joseph Varghese
Vous pouvez utiliser CountDownLatch.
C'est comment vous pouvez l'utiliser.
message
n'est pas déclaré. Si vous déclarezmessage
au début de la fonction en tant queString message = null
, il doit être déclaréfinal
trop ou il ne compile pas. Et puis depuis sa finale, vous ne pouvez pas mettre à jourmessage
plus au sein deonDataChange
. C'est tellement frustrant. Presque aucun moyen d'obtenir les données deonDataChange
pour le monde extérieur dans un endroit propre morceau de code.Génial façon de le faire! @Zod Utilisation finale AtomicReference ou un tableau wrapper g/définir le message
Vous pouvez aussi ajouter des
public synchronized String getMessage()
à la signature de la méthode pour s'assurer qu'un seul thread est l'appel de cette méthode à la fois. Sans elle, les tests empiriques prouvé j'ai fait le mauvaismessage
revenu environ 10% du temps lors de l'exécution de cette méthode en parallèle (par exemple, deux ou plusieurs demandes à venir dans votre servlet dans le même temps, de sorte que les deux fils à l'appel de cette méthode en même temps).ici, j'ai manqué de déclarer "message" de la variable qui est source de confusion pour les utilisateurs à la recherche de réponses. @NathanAdams est correct. Je vais modifier la réponse. Merci Nathan pour la clarification.
OriginalL'auteur Tirupati Singh
N'utilisez pas de Firebase comme des fonctions qui renvoient des valeurs - elle va à l'encontre de la nature asynchrone.
Plan de la structure de code qui permet de Firebase pour effectuer la tâche, puis au sein de la fermeture (bloquer) passez à l'étape suivante.
Dans votre code, par exemple, de changer la fonction ne retourne rien, et au sein de la onDataChange, comme la dernière ligne de l'appel à la fonction suivante pour mettre à jour votre INTERFACE utilisateur.
oui, possible, il est utile seulement pour android utiliser uniquement
OriginalL'auteur Vladyslav Ulianytskyi
Je vais le laisser ici pour aider toute personne qui est confrontée au même problème que moi. @Tirupati Singh code a l'air sympa, mais j'ai écrit ma réponse en dessous de ses pourquoi il n'a pas de travail pour moi. À l'aide de type Atomique travaillé -
Remarque la fonction ne peut renvoyer un message de type Integer. Je ne pouvais pas le faire fonctionner pour une Chaîne comme aucun Atomique de type Chaîne. Espérons que cette aide!
OriginalL'auteur Zod
@CMikeB1 a commenté sur une autre réponse, dans le monde java lorsque nous traitons avec des servlets et des services reste nous utilisons la synchronisation des appels pour effectuer des opérations, il serait utile d'avoir les deux options dans le sdk firebase administrateur afin que le développeur puisse choisir lequel utiliser en fonction de son utilisation de cas.
J'ai fait ma mise en œuvre de l'attente de lire les données de synchronisation à l'aide de ApiFuture qui est l'interface actuelle adoptée par le sdk de la firebase admin. voici un lien!
OriginalL'auteur Pedro Bacchini