2017-04-25 53 views
0

我正在android應用程序中使用firebase併發生了一些奇怪的事情,在我的示例中,我需要兩個快照,1來獲取列表中的用戶(我使用這個快照來填充一個ArrayList字符串與用戶的關鍵字),另一個與用戶比較,奇怪的行爲是,我的arraylist在第一個快照後是空的,我用logcat來檢查它,並且firstsnapshot內的Log返回1作爲大小arraylist,第二個返回我0,不知道它是如何得到0。ArrayList在第一次快照後變空

這裏是我的代碼:

private void prepareFriendList() { 
     myRef.child(id).child("FriendLists").child(group).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String keyUser; 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        Log.d("number:",snapshot.getKey()); 
        keyUser = snapshot.getKey(); 
        currentFriends.add(keyUser); 
        Log.d("hello",String.valueOf(currentFriends.size())); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     for(String s: currentFriends){ 
      Log.d("idddd",s); 
     } 

     Log.d("hello",String.valueOf(currentFriends.size())); 



     myRef.child(id).child("Users").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 

        User user = snapshot.getValue(User.class); 

        for(String item: currentFriends){ 
         if (snapshot.getKey().equals(item)) { 
          usersList.add(user); 
         } 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     mAdapter.notifyDataSetChanged(); 
    } 

我不明白,爲什麼出現這種情況,因爲我加入數組列表裏面的關鍵,任何提示?

回答

1

發生這種情況是因爲onDataChange被異步調用。這意味着在調用onDataChange之前執行將用戶添加到list的語句。這就是爲什麼您的list在該方法之外爲空。所以爲了使用這個列表,你需要在onDataChange()方法中使用它。

如需其他方法,請訪問此post和此post

希望它有幫助。

+0

那麼我明白這個問題謝謝你的迴應,但事情是我不能在一個監聽器中實現一個監聽器,因爲我需要2個不同的引用,我試圖把我的第二個監聽器放在onchange中,但它永遠不會進入有什麼建議嗎? –

+0

是的,您可以使用嵌套的「偵聽器」。只要每個聽衆有一個特定的「參考」,就不會有問題。最後,不要忘記在'onDestroy'方法中刪除'listeners':'yourReference.removeEventListener(valueEventListener);' –

+0

你能舉例說明如何將第二個'myRef'代碼放入第一個' myRef'代碼,因爲我試過了,它不起作用:/ –

相關問題