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();
}
Est-ce que ça marche maintenant? –
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! –
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. –