2016-06-08 28 views
5

Sto utilizzando la funzione di database Realtime di Firebase nella mia applicazione. Il database è simile al seguente: database snapAndroid: Firebase impiega troppo tempo per recuperare i dati

I nodi 104, 1040 ... hanno ulteriori elementi/dati. Sto recuperando questi dati ordinandoli per valore su un nodo 'updatedAt' disponibile all'interno di ogni padre Integer come mostrato nello snap. Sto usando onChildAddedListener() per recuperare gli ultimi 20 elementi. Ci sono circa 1050 nodi all'interno di "risultati".

Il problema:

  1. Il recupero dei dati richiede troppo tempo, circa 30 secondi, anche su WiFi ad alta velocità.

  2. Firebase consente a qualsiasi richiamata di notificare che i dati sono stati recuperati? Voglio aggiungere ogni oggetto personalizzato a ArrayList ricevuto da Firebase e passarlo attraverso l'intento verso un'altra attività. Sto contando gli oggetti ricevuti e quando diventa 20, apro la mia attività. È questo l'unico modo per farlo? Se c'è qualche via d'uscita migliore, suggerisci.

Ecco il mio codice:

public class Splash extends AppCompatActivity{ 

     private static final String TAG = "Splash Activity"; 
     private ArrayList<News> NewsArrayList = new ArrayList<>(); 
     private DatabaseReference newsReference; 
     private int position = 0; 

     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_splash); 

      newsReference = FirebaseDatabase.getInstance().getReference().child("results"); 
      Query queryNewsReference = newsReference.orderByChild("updatedAt").limitToLast(20); 
      fetchNews(queryNewsReference); 
     } 

     private void fetchNews(Query queryNewsReference) { 

      queryNewsReference.addChildEventListener(new ChildEventListener() { 
       @Override 
       public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
        Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); 
        News newsObject = dataSnapshot.getValue(News.class); 
        Log.d(TAG,"News Title: "+ newsObject.getVideo_title()); 
        NewsArrayList.add(newsObject); 
        position++; 
        if(position == 20){ 
        startMainActivity(); 
        } 
       } 
       @Override 
       public void onChildChanged(DataSnapshot dataSnapshot, String s){ 
        Log.d(TAG, "onChildChanged() called on key: "+ dataSnapshot.getKey()); 
       } 

       @Override 
       public void onChildRemoved(DataSnapshot dataSnapshot) { 
        Log.d(TAG, "onChildRemoved() called on key: "+ dataSnapshot.getKey()); 
       } 

       @Override 
       public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
        Log.d(TAG, "onChildMoved() called on key: "+ dataSnapshot.getKey()); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.e(TAG,"Database Error: "+databaseError.toString()); 
       } 
      }); 
     } 

     private void startMainActivity() { 
      Intent intent = new Intent(Splash.this,MainActivity.class); 
      intent.putExtra("NewsList",NewsArrayList); 
      Splash.this.startActivity(intent); 
     } 
+0

fa il ritardo di 30 secondi verificarsi prima di vedere il primo messaggio logcat "onChildAdded" ? Una volta che vedi il primo "onChildAdded", gli altri seguono immediatamente? –

+0

@qbix Sì. 30 secondi prima di vedere "onChildAdded". A proposito, qual è la differenza? Se viene chiamato onChildAdded(), significa che i dati sono stati recuperati, giusto? – brainbreaker

+0

Alla ricerca di indizi. FWIW Ho creato un test case molto simile al tuo (1100 oggetti, ordinati per bambino, limitati agli ultimi 20) e non vedo i ritardi. Sono in California, forse una connessione migliore con i server di te. –

risposta

0

Prova la riconnessione alla Firebase prima di aggiungere valore ascoltatore:

private void fetchNews(Query queryNewsReference) 
{  
    if (FirebaseDatabase.getInstance() != null) 
    { 
     FirebaseDatabase.getInstance().goOffline(); 
    } 

    FirebaseDatabase.getInstance().goOnline(); 

    queryNewsReference.addChildEventListener(new ChildEventListener() { 

    ... 
} 
Problemi correlati