Espere los datos async retrive de Firebase en android
Necesito almacenar el resultado del método getValue 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:
- Up-Sync y Down-Sync en Android?
- Monitor de estado de subprocesos. ¿Cómo depurar esto? ¿Qué lo causa?
- ¿Qué es una buena implementación en la actualización de elementos que cambian mucho en RecyclerView (intercambio) y la retroalimentación inmediata de los usuarios?
- Aplicación de Android que usa Google Calendar - Problema de sincronización
- Artículos de adaptador de sincronización para Android múltiples como Cuenta de Google?
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 de "onDataChange" tengo, naturalmente por su vida asíncrona, valor nulo. Hay una manera de asegurar que onDataChange fue llamado ?.
Gracias por adelantado.
- ¿Cómo usar una clase SyncAdapter para varias autoridades?
- ¿Cómo recuperar el tiempo de 'última sincronización' para una cuenta?
- ¿Cómo notificar a la actividad de llamada cuando SyncAdapter ha finalizado?
- SQLiteOpenHelper sincronización
- Cómo habilitar la sincronización de la cuenta personalizada en android?
- ¿Cómo usar Git en Android?
- Android Syncadapter no permitir que el usuario elija sincronizar o no sincronizar
- ¿Posee un adaptador de sincronización para Android?
Lo siento si no es lo que quieres porque mi inglés es demasiado 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, 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, lo 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.
Sólo para añadir a la respuesta de Manh, se podría llamar a onStart()
justo antes
FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() {
Y en onStart()
, típicamente mostraría un progressDialog:
if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(getContext()); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show();
Y en onSuccess()
descartar el diálogo y cargar los datos en GUI (o lo que quieras hacer)
if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); }
- Gson no puede analizar una cadena de datos de formato json en Kotlin
- Cómo obtener el lugar actual mediante Google Place API