web-dev-qa-db-fra.com

Attendez que Firebase async récupère des données sous Android

Je dois stocker le résultat de la méthode FireBase getValue qui est asynchrone par la sienne. Je ne peux pas utiliser quelque chose comme "onPostExecute ()" et, pour ce qui me concerne, je ne peux pas exécuter toutes mes opérations "dans onDataChange ()" car j'ai besoin de références dans le futur pour d'autres activités.

Voici mon extrait pour récupérer des données:

    List<Village> villages = new LinkedList<>();
    Firebase ref = new Firebase("MYFIREBASEURL").child("village");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            spinnerArray.clear();
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Village v = postSnapshot.getValue(Village.class);
                villages.add(v);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });

Si j'essaie de lire des villages sur "onDataChange", j'ai naturellement, pour sa vie asynchrone, une valeur nulle. Il existe un moyen de s’assurer que onDataChange a été appelé ?.

9
Marco Rossini

Désolé si ce n'est pas ce que tu veux parce que mon anglais est dommage. Vous pouvez définir une interface d'écoute pour la gérer. Exemple:

 public interface OnGetDataListener {
    public void onStart();
    public void onSuccess(DataSnapshot data);
    public void onFailed(DatabaseError databaseError);
}

Et je crée une fonction personnalisée pour obtenir des données dans Database.class: 

  public void mReadDataOnce(String child, final OnGetDataListener listener) {
    listener.onStart();
   FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            listener.onSuccess(dataSnapshot);
        }

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

Lorsque je veux obtenir des données de Main.class, je fais: 

private void mCheckInforInServer(String child) {
    new Database().mReadDataOnce(child, 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
        }

        @Override
        public void onFailed(DatabaseError databaseError) {
           //DO SOME THING WHEN GET DATA FAILED HERE
        }
    });

}

De cette manière, vous pouvez réutiliser votre méthode et manipuler des données.

19

Pour ajouter à la réponse de Manh, on appellerait onStart() juste avant

 FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {

Et dans onStart(), vous montrez généralement un progressDialog:

    if (mProgressDialog == null) {
        mProgressDialog = new ProgressDialog(getContext());
        mProgressDialog.setMessage(getString(R.string.loading));
        mProgressDialog.setIndeterminate(true);
    }

    mProgressDialog.show();

Et dans onSuccess(), fermez la boîte de dialogue et chargez les données sur l'interface graphique (ou ce que vous voulez faire).

    if (mProgressDialog != null && mProgressDialog.isShowing()) {
        mProgressDialog.dismiss();
    }
2
Bakavani India

Ce que j'ai compris, c'est que vous essayez de sauvegarder les données d'instantané dans une variable, mais en raison d'une tâche asynchrone, la variable s'avère être nulle. En raison de la nature de la tâche async, vous pouvez transmettre les données d'instantané à partir de Firebase Listener. fonction à votre fonction personnalisée à l'extérieur et stocker les données de capture instantanée dans une variable globale.Ensuite, vous pouvez utiliser la variable comme vous le souhaitez.

0
Natto