2017-10-19 32 views
1

Quand je lance le code suivant: Je reçois les messages de pain grillé dans l'ordre suivant:problèmes avec les interfaces en Java en ce qui concerne la récupération et le stockage des données à partir d'une base de données Firebase

« Inside mCheckInforInServer » -> « text Publié "-> "A pris la valeur"

Comment puis-je changer mon code pour obtenir dans l'ordre suivant:

"Inside mCheckInforInServer" -> "A pris la valeur" -> "text Posté"

Les trois fonctions

getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() { 
       @Override 
       public void onComplete(@NonNull Task<Void> task) { 

        system_time = System.currentTimeMillis(); 
        getServerTime.addListenerForSingleValueEvent(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          server_time_long = dataSnapshot.getValue(Long.class); 


public interface OnGetDataListener { 
    public void onStart(); 

    public void onSuccess(DataSnapshot data); 

    public void onFailed(DatabaseError databaseError); 
} 

public void mReadDataOnce(final OnGetDataListener listener) { 
    listener.onStart(); 

    getServerTime = FirebaseDatabase.getInstance().getReference("Users/Arjun/ServerTime"); 
    getServerTime.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      listener.onSuccess(dataSnapshot); 
      Toast.makeText(MainActivity.this, "Took value", Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      listener.onFailed(databaseError); 
     } 
    }); 


} 

private void mCheckInforInServer() { 
    Toast.makeText(MainActivity.this, "Inside mCheckInforInServer", Toast.LENGTH_LONG).show(); 

    mReadDataOnce(new OnGetDataListener() { 
     @Override 
     public void onStart() { 
      //DO SOME THING WHEN START GET DATA HERE 

     } 

     @Override 
     public void onSuccess(DataSnapshot data) { 
      //DO SOME THING WHEN GET DATA SUCCESS HERE 
      server_time_display.setText(String.valueOf(data)); 
      Toast.makeText(MainActivity.this, "Posted text", Toast.LENGTH_LONG).show(); 


     } 

     @Override 
     public void onFailed(DatabaseError databaseError) { 
      //DO SOME THING WHEN GET DATA FAILED HERE 
      Toast.makeText(MainActivity.this, "Failed to post text", Toast.LENGTH_LONG).show(); 

     } 
    }); 
} 

Où j'appelle la fonction

J'appelle la fonction de la sur-cliquez sur l'événement d'un bouton:

 get_times.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 





      mCheckInforInServer(); 

    } 

Répondre

0

Vous ne pouvez pas modifier l'ordre d'affichage ces Toasts parce que la méthode onDataChange() est appelée asynchronous ce qui signifie que le Toast que vous essayez d'afficher Posted text est appelé avant même que vous essayez t o obtenir les données de la base de données. C'est pourquoi vous avez cet ordre d'exécution.

Pour résoudre ce problème, tout ce que vous devez obtenir à partir de la base de données doit être utilisé à l'intérieur de la méthode onDataChange() sinon ce sera null.

Si vous souhaitez utiliser les données de la base de données en dehors de la méthode onDataChange(), je vous suggère de voir ma réponse à partir de ce post.

+0

Est-ce que ça marche maintenant? –

+0

Pouvez-vous être plus précis en réécrivant le code ici? D'après ce que je peux dire, ce que j'ai posté ici et votre réponse à ce poste sont à peu près les mêmes. Mais ça ne marche toujours pas pour moi. Si je veux attribuer la valeur de l'horodatage de la base de données à une variable globale, comment procéder? Je ne comprends pas non plus ce qu'il faut passer comme paramètre 'enfant'; studio android dit aussi 'l'enfant n'est jamais utilisé'. Alors, s'il vous plaît, clarifiez ces points pour moi. Et ce serait génial si vous pouviez littéralement réécrire le code! Merci beaucoup! –

+0

Arjun, il n'y a aucun moyen dans lequel vous pouvez passer la valeur de l'horodatage de la base de données à une variable globale, car c'est ainsi que cela fonctionne quand il s'agit de méthodes asynchrones. La seule chose que vous devez faire est d'utiliser la valeur de votre 'timestamp' dans la méthode' onDataChange() '. C'est. C'est la manière simple. –