我正在使用Firebase数据库来存储我的用户游戏分数,在游戏结束时,用户可以看到每个成员的最终结果
我的用户数据和他们的分数存储在两个不同的位置
下面是我在Firebase中的结构。
Posts
-KLpcURDV68BcbAvlPFy
user_id: "KLpcURDV68BcbAvlPFy"
score: "A"
-asdasdasddsad
user_id: "asdasdasddsad"
score: "B"
Users
-KLpcURDV68BcbAvlPFy
id: "KLpcURDV68BcbAvlPFy"
name: "Jordan"
-asdasdasddsad
id: "asdasdasddsad"
name: "Tyler"因此,我从一个数组列表中的子对象(帖子)加载第一个Id,并在我使用ListIterator为子对象(用户)中的每个id加载数据之后。
我的问题很简单。如何暂停ListIterator
我在我的ListIterator中有一个Firebase onDataChanged加载,它返回null,因为我的列表完成得比我的Firebase加载快,我如何让我的列表等待我的Firebase数据库加载必要的数据,然后恢复它自己?
我的代码
for (ListIterator<String> it = list.listIterator(); it.hasNext(); i++) {
String UserUid= it.next();
LoadataValue(UserUid, new OnObjectExistListener<String>() {
@Override
public void onDataChanged(Data userData) {
ListIterator must resume here
}
});
ListIterator must pause Here
}发布于 2020-10-21 06:41:20
你不能按你想要的方式暂停列表迭代器。让我来解释一下。
Firebase通过互联网在一个单独的后台线程中获取数据,它应该需要一些时间来触发onDataChanged方法,而列表迭代器可能正在主线程中运行。因此,您必须始终等待后台线程完成,并将一些数据返回到主线程才能显示它们。您可以通过许多不同的方式来实现该行为。
看起来您正在尝试从firebase中获取所有用户详细信息。我假设您的firebase数据库的简化结构如下所示。
users:
user1:
userDetails:
name: Everyone
user2:
userDetails:
name: Needs
user3:
userDetails:
name: some
user4:
userDetails:
name: help您可以尝试一次从users节点获取所有值,并将它们存储在本地(可能存储在List<User>中)。然后,在onDataChange函数中正确下载用户列表后,使用单独的方法触发列表迭代器,以便它可以遍历本地存储的列表,并为您提供所需的结果。
下面是一个伪实现。
// Get a reference to your users
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("your-firebase-url/users");
// Attach a listener to read the data from your firebase database
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<User> users = dataSnapshot.getValue(User[].class);
callAFunctionThatRunsThroughThisListOfUsers(users);
}
});https://stackoverflow.com/questions/64454013
复制相似问题