gpt4 book ai didi

java - ArrayList 未在 onChildAdded 函数内更新

转载 作者:行者123 更新时间:2023-12-01 07:50:02 25 4
gpt4 key购买 nike

public class DataService {

private static DataService ourInstance = new DataService();
private DatabaseReference mDatabase;


public static DataService getInstance() {
return ourInstance;
}

public ArrayList<UserDatabase> getFriendList() {

mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();

mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class);
list.add(userDatabase);
}

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}

@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}

@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}

@Override
public void onCancelled(DatabaseError databaseError) {}
});

return list;
}
}

我正在尝试从 users 节点获取我的用户数据库。它的表现真的很奇怪。当我在 onChildAdded 函数处设置断点时,它将检索所有用户并将其添加到列表中。

但是,如果我不在那里设置断点,它就不会得到任何东西,并且列表大小为 0。有人知道发生了什么吗?提前致谢!

最佳答案

从 Firebase 异步加载和同步数据。

如果添加一些适当的日志记录语句,最容易找出导致问题的原因:

public ArrayList<UserDatabase> getFriendList() {

mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();

System.out.println("Attaching listener");
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("Got data");
}

public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
public void onChildRemoved(DataSnapshot dataSnapshot) {}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
public void onCancelled(DatabaseError databaseError) {}
});

System.out.println("Returning list");
return list;
}

输出将按以下顺序打印:

Attaching listener

Returning list

Got data

这可能不是您期望的顺序。但它确实解释了为什么如果按原样运行代码,列表为空。

原因是 Firebase 异步加载和同步数据。与大多数现代 Web API 一样,它不会等待结果返回(这会导致糟糕的用户体验),而是让程序继续并在获取(新)数据时回调到您的代码。

处理这种行为的方法是将程序流程从“首先获取好友列表,然后对其执行 xyz”重新构建为“每当好友列表发生变化时,对其执行 xyz”。

例如,假设您只想打印有多少 friend 。您当前的方法可能是:

ArrayList<UserDatabase> friends = getFriendList();
System.out.println("There are "+friends.size()+" friends");

对于 Firebase,处理此问题的一种方法是将操作移至 getFriendList():

public void getFriendList() {

mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();

mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class);
list.add(userDatabase);
System.out.println("There are "+friends.size()+" friends");
}

public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
public void onChildRemoved(DataSnapshot dataSnapshot) {}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
public void onCancelled(DatabaseError databaseError) {}
});

}

关于java - ArrayList 未在 onChildAdded 函数内更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com