2016-07-19 13 views
0

so meine Frage sagt alles. In OnCreate versuche ich, Objekte abzufragen, aber ich möchte, dass der UI-Thread wartet, bis ich alle meine Objekte abgefragt habe, damit ich mit ihnen Ansichten erstellen kann, die mein Benutzer sehen kann. Kann jemand das mit Beispielcode machen?Wie wird der UI-Thread angehalten, bis die Firebase-Abfrage abgeschlossen ist?

hier ist wie ich abfrage.

Firebase cardReference = mRef.child("aReference"); 
     cardReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { 
        CardModel fireBaseCard = dataSnapshot1.getValue(CardModel.class); 
        testCardModelArray.add(fireBaseCard); 
        cardStack.setCardModelIDInArrayList(fireBaseCard.getCardID()); 
       } 
       setUpCardStack(); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 

Ich hoffe, ihr könnt helfen!

+3

Verwenden Sie einen Ladebildschirm, der bis zu dem Zeitpunkt, dass Sie Ihre Abfrage beenden? –

+0

Sie möchten den UI-Thread definitiv nicht einfrieren. Das ist UX-Hölle und eine todsichere Möglichkeit, App-Downloads zu verlieren. Verwenden Sie eine Art von Lademechanismus (Ex-Fortschrittsbalken, Ladebildschirm, etc.) – mastrgamr

+0

Sie besser verwenden Splash-Screen (Aktivität). Siehe dieses Beispiel: http://www.androidhive.info/2013/07/how-to-implement-android-splash-screen-2/ –

Antwort

0

Hmm, also willst du deine Sachen in einem separaten Hintergrund Thread laufen lassen?

Zuerst eine private boolean erstellen:

private boolean isQueryingFinished = false

schreiben diese in onCreate:

Thread thread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     // do your stuff here 
     isQueryingFinished = true; 
    } 
}); 
thread.start(); 
while(!isQueryingFinished); 

Diese warten, bis der Faden Ihre Sachen in der onCreate fortzusetzen abgeschlossen()

Sie könnten es auch so tun:

while(!isQueryingFinished) { 
    try { 
     Thread.sleep(500); 
    } catch(Exception ex) {/* */} 
} 

Auf diese Weise würde es alle 0,5 Sekunden (500 ms) überprüfen, wenn es fertig ist.

Aber ich denke nicht, dass das so gut ist.

Vielleicht wäre es besser, eine Art von Hörer zu verwenden:

public interface QueryFinishedListener { 
    void onQueryFinished(); 
} 

Dann definieren Sie es in Ihrer Aktivität:

private QueryFinishedListener mQueryFinishedListener;

nun einen neuen in onCreate erstellen():

mQueryFinishedListener = new QueryFinishedListener() { 
    public void onQueryFinished() { 
     // do whatever you need to do when finished 
    } 
}; 
// do your query stuff here 
mQueryFinishedListener.onQueryFinished(); 

Wieder glaube ich nicht, dass das wirklich nützlich ist, Wenn Sie etwas tun, das länger dauert, wird die Benutzeroberfläche automatisch eingefroren.

+1

Firebase führt die Datensynchronisierung bereits über den Hauptthread der Benutzeroberfläche aus. Das in einen anderen Thread zu bringen wird nicht helfen. Der Completion-Listener ist eine gute Idee. Beachten Sie jedoch, dass Firebases "ValueEventListener" bereits ein Beendigungshandler ist. –

0

Sie sollten eine AsyncTask verwenden. Setzen Sie Ihren gesamten Code in die doInBackground-Methode und in onPostExecute machen Sie eine Animation wie ein Spinner oder etwas. `mAsyncTask = new AsyncTask() {

  @Override 
      protected String doInBackground(Void... voids) { 
       //put your code here 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       //make a spinner here 
      } 
     }; 
     mAsyncTask.execute();` 
+0

Firebase führt die Datensynchronisierung bereits über den Haupt-UI-Thread aus. Putting in eine 'AsyncTask' wird nicht helfen. –

+0

@Gorg Yeah Ich denke, ich werde Splash-Screen implementieren, wie Frank in den obigen Kommentaren darauf hingewiesen hat. –