2017-01-28 2 views
0

J'ai un fragment, quand mon fragment commence, j'ai besoin d'interroger ma base de données temps réel firebase. J'ajoute directement le code de connexion à la base de données lors de l'exécution de la méthode onCreate, je reçois toujours la valeur null lors de l'impression du toast.Récupérer des données de la base de données lors de la création de la classe

@Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
          @Nullable Bundle savedInstanceState) { 
     View r = inflater.inflate(R.layout.friends, container, false); 


     FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
     FirebaseUser user = mAuth.getCurrentUser(); 
     FirebaseDatabase db = FirebaseDatabase.getInstance(); 

     String userEmail = user.getEmail(); 

     DatabaseReference userDetails = db.getReference("users").child(userEmail); 

     userDetails.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       myUser = dataSnapshot.getValue(User.class); 
       postCount = myUser.getTotalPosts(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 



     Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 

Donc ce que je ne faisais que j'ai essayé envelopper toute la connexion de base de données et récupérer le code dans un bloc statique, car cela devrait fonctionner d'abord quand la classe est créée

static{ 
// everything in here from above code excluding the toast 
} 

J'ai ensuite essayé d'imprimer postCount encore à l'intérieur de onCreateView() mais toujours obtenir le même résultat où postCount est nul

Comment puis-je surmonter cela?

grâce

PS Je suis sûr que le nœud que je suis à l'écoute sur existe dans la base de données

+0

Il est évident que vous devez utiliser cette valeur lorsque est réglé. Évidemment, il est situé à l'intérieur d'ondatachange – Selvin

Répondre

1

Ceci est tout simplement parce que addListenerForSingleValueEvent travaille sur un autre hors fil interface utilisateur (fil d'arrière-plan) et votre Toast.makeText(...) travaille sur Fil d'interface utilisateur.

Ainsi, l'exécution de Toast.makeText(..) a lieu avant même que la valeur de postCount ne soit mise à jour. Ainsi, dans le Toast.makeText(), vous obtenez la valeur par défaut de postCount.

Pour enlever cela, vous pouvez écrire

Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 

dans votre méthode de OnDataChange.

par exemple:

@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
myUser = dataSnapshot.getValue(User.class); 
postCount = myUser.getTotalPosts(); 
Toast.makeText(getActivity(), "jjjjj " + postCount, Toast.LENGTH_SHORT).show(); 
} 
+0

Rend un sens merci, je ne savais pas que l'appel était asynchrone – memoryManagers