2017-09-25 22 views
1

我想從裏面火力地堡取數據,以檢查該用戶是否在數據庫中存在,但有我解決不了的問題,聽衆觸發遲到,這是我的代碼: -獲取數據

  • 如果我刪除while循環,我不能獲取對象快速
  • 如果我繼續while循環我進入無限循環,我不知道爲什麼 爲什麼聽者不會觸發

    DataSnapshot fetched ; 
    public boolean user_exist(final String user) throws Exception { 
    users.addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         fetched = dataSnapshot ; 
        } 
        @Override 
        public void onCancelled(DatabaseError databaseError) { 
        } 
    }); 
    while (fetched == null){ 
        Log.e("dbController","not fetched yet"); 
    } 
    return fetched.hasChild(user); 
    } 
    
+0

你不告訴你是如何觸發事件。 while循環阻塞線程有沒有機會?您需要從另一個線程觸發事件。並且不要用一段時間以100%運行。您的監聽器可以添加到隊列中,而且您可以在項目添加到隊列時記錄日誌。 –

+0

數據是從Firebase異步加載的。你不能從(常規,同步)函數中返回它。見https://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

所以你建議讓主線程等待足夠的時間,聽者觸發?我已經試過這個解決方案,但沒有鍛鍊第一次我打電話功能抓取是空的第二次它不是空 –

回答

0

Firebase必須從數據庫中提取數據並將其放入您的應用中。這可能需要時間,因此應該在後臺完成。當您添加valueEventListener時,抓取將在後臺完成。你可能會顯示一個進度條,顯示數據仍然加載,一旦數據在手,做的代碼的其餘部分:

users.child(user).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.exists()) { 
      funUserExists(); 
     } else { 
      funNoUser(); 
     } 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) { 
    } 
});