2015-12-30 29 views
32

我正在使用Firebase實時數據庫存儲和檢索我的Android應用程序的數據。在我的活動中,我使用childEventListener從Firebase檢索所有數據(例如:用戶數據列表)。瞭解Firebase上的childEventListener是否已完成加載所有數據

只要數據沒有從數據庫中完整檢索,我想顯示一個進度條。如何檢查所有數據是否完全檢索,以便在數據加載後關閉進度欄?

回答

66

有一種常見的方法來檢測Firebase何時完成同步給定位置上的初始數據。這種方法利用了Firebase event guarantees之一:

值事件總是觸發的最後,並保證包含來自被採取快照之前發生的其他事件的更新。

因此,如果你同時擁有ValueEventListener並在給定的位置ChildEventListener,將ValueEventListener.onDataChange()可以保證被稱爲所有onChildAdded()通話發生。您可以使用此當初始數據加載完成知道:

ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items"); 
    } 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 
ref.addChildEventListener(new ChildEventListener() { 
    public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) { 
     System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey); 
    } 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
    } 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 
    } 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 
    } 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 

在我的測試中運行這個結果:

Add -K2WLjgH0es40OGWp6Ln to UI after null 
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln 
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs 
... 
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On 
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP 
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu 
We're done loading the initial 121 items 

所以,你可以使用onDataChanged()事件隱藏進度條。

但有一點要記住:Firebase不只是加載數據。它連續同步數據從服務器到所有連接的客戶端。因此,數據完全沒有被檢索的時刻完全

+0

很好的答案!感謝您的回答。有用!你的答案真的很有用。但我想問一下,爲什麼addListenerForSingleValueEvent onDataChange仍然在引用中發生變化時調用?是addListenerForSingleValueEvent只調用一次然後它刪除或我是假的? –

+0

當您使用'addListenerForSingleValueEvent()'添加偵聽器時,只會針對一個值事件調用它。之後,它會自動刪除。閱讀文檔中有關這些內容的更多信息:https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once –

+0

因此,每次調用onDataChange()時都會引用in Firebase被更改或添加?或者只調用一次然後偵聽器被刪除?因爲當我使用'addListenerForSingleValueEvent()'時,'onDataChange()'被調用後,偵聽器不會從引用中移除,並且當我在引用中添加新值時,調用'onDataChange()'再次。 –

4

我以相當簡單的方式完成了它。我讓int計數,然後每當它進入函數內部時,我就增加它並檢查它是否等於孩子的總數。如果它相等那麼你可以停止進度條

int count = 0;  
    ref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      count++; 


      if(count >= dataSnapshot.getChildrenCount()){ 
       //stop progress bar here 
      } 
     } 
+0

和我的英文是有點弱:D – osama

+0

你如何擺脫聽衆?或者我們不必擔心這一點? – Lion789

+0

不,你不需要擔心聽衆 – osama

相關問題