android firebase asynchronous firebase-realtime-database synchronization

Espera Firebase async recupera datos en Android



asynchronous firebase-realtime-database (3)

Lo que entendí es que está tratando de guardar los datos de la instantánea en una variable, pero debido a la tarea asincrónica, la variable resulta ser nula, esto se debe a la naturaleza de la tarea asincrónica, lo que podría hacer es pasar los datos de la instantánea desde el oyente de Firebase funciona con su función personalizada fuera y almacena los datos de la instantánea en una variable global. Luego puede usar la variable como lo desee.

Necesito almacenar el resultado del método getBalue de FireBase que es asíncrono por su cuenta. No puedo usar algo como "onPostExecute ()" y, para mi propósito, no puedo ejecutar toda mi operación "en onDataChange ()" porque necesito algunas referencias en el futuro en otras actividades.

Aquí mi fragmento para recuperar datos:

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 trato de leer las aldeas fuera de "onDataChange", tengo, naturalmente, por su vida asincrónica, un valor nulo. Hay una manera de garantizar que se llamó a onDataChange ?.


Lo siento si no es lo que quieres porque mi inglés es muy malo. Puede definir una interfaz de escucha para manejarla. Ejemplo:

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

Y creo una función personalizada para obtener datos en 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); } }); }

Cuando quiero obtener datos de Main.class, hago:

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 esta manera, puede reutilizar su método y manejar los datos.


Solo para agregar a la respuesta de Manh, uno llamaría a onStart() justo antes

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

Y en onStart() , normalmente mostrarías un progressDialog:

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

Y en onSuccess() descarta el diálogo y carga los datos en la GUI (o lo que quieras hacer)

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