2017-09-24 80 views
0

我知道這已被問了很多,但我仍然可以得到它的工作。這裏是我的代碼:Android Firebase addListenerForSingleValueEvent不起作用

private int test; 

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference userRef = rootRef.child("Users"); 

test = 0; 
userRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.hasChild(userID)) 
      test = 1; 
     else 
      test = 2; 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

Log.d(TAG, "Test = " + test); 

下面是對火力地堡:

  • 應用程序的名字,e545e
    • 用戶
      • 用戶ID

我不知道爲什麼,但變量「測試」總是返回值0,這意味着addListenerForSingleValueEvent不起作用。感謝您的幫助,先進的

+1

你有使用addListenerForSingleValueEvent的原因嗎?你不應該在監控兒童節點時使用addChildEventListener嗎? – riggaroo

+0

由於Stack Overflow上的很多線程都使用addListenerForSingleValueEvent,所以我沒有想過使用它。我會試着看看它是否有效 – leScepter

回答

3

數據是從Firebase異步加載的。當你的日誌testonDataChange尚未運行。

要看到這個動作,添加一些記錄onDataChange

私人詮釋試驗;

test = 0; 
userRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.hasChild(userID)) { 
      test = 1; 
     } 
     else { 
      test = 2; 
     } 
     Log.d(TAG, "Test2 = " + test); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     throw databaseError.toException(); // Don't ignore errors 
    } 
}); 

Log.d(TAG, "Test = " + test); 

現在,你會首先看到:

測試= 0

然後一旦數據加載和onDataChange被調用:

測試= 1

測試= 2

出於這個原因,你應該始終把(或電話),從onDataChange()內需要從數據庫中數據的代碼。

+0

確實我愛你的長答案<3 –

+0

這對我有用。非常感謝你 – leScepter

+0

好聽!如果我的回答很有用,請點擊左側的upvote按鈕。如果它回答了您的問題,請點擊複選標記以接受它。這樣別人就知道你已經(充分)幫助了。 –

相關問題