第一个快照

时间:2017-04-25 13:32:41

标签: android firebase arraylist firebase-realtime-database

我在Android应用程序中使用firebase并且发生了一些奇怪的事情,在我的示例中我需要两个快照,1用于获取列表中的用户(我使用此快照用字符串填充字符串的arraylist用户和另一个与用户比较,奇怪的行为是我的arraylist在第一个快照后是空的,我使用logcat检查它,并且firstsnapshot里面的Log返回1作为arraylist的大小,第二个返回我0,不知道如何再次获得0。

这是我的代码:

 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();
    }

我不明白为什么会这样,因为我在arraylist中添加了密钥,任何提示?

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为onDataChange是异步调用的。这意味着在list被调用之前执行将用户添加到onDataChange的语句。这就是为什么你的list在该方法之外是空的。因此,为了使用该列表,您需要在onDataChange()方法中使用它。

对于其他方法,请访问此post和此post

希望它有所帮助。