Android 如何暂停ListIterator

Android 如何暂停ListIterator,android,firebase,for-loop,firebase-realtime-database,iterator,Android,Firebase,For Loop,Firebase Realtime Database,Iterator,我使用Firebase数据库来存储我的用户在游戏中的得分,在游戏结束时,用户可以看到每一方成员的最终结果 我的用户数据和他们的分数存储在两个不同的位置 这是我在Firebase中的结构 Posts -KLpcURDV68BcbAvlPFy user_id: "KLpcURDV68BcbAvlPFy" score: "A" -asdasdasddsad user_id: "asdasdasddsad"

我使用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"
因此,我从Arraylist中的Child(Posts)加载第一个Id,然后使用ListIterator为Child(Users)中的每个Id加载数据

我的问题很简单。如何暂停ListIterator

我在My 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 
    }
for(ListIterator it=list.ListIterator();it.hasNext();i++){
字符串UserUid=it.next();
LoadataValue(UserUid,新的OnObjectExistListener(){
@凌驾
公共无效onDataChanged(数据用户数据){
ListIterator必须在此处恢复
}
});
ListIterator必须在此处暂停
}

您不能按您希望的方式暂停列表迭代器。让我解释一下

Firebase通过internet在单独的后台线程中获取数据,触发
onDataChanged
方法需要一些时间,而您的列表迭代器可能正在主线程中运行。因此,您必须始终等待后台线程完成,并将一些数据返回到主线程以显示它们。您可以通过许多不同的方式实现该行为

看起来您正试图从firebase获取所有用户详细信息。我假设firebase数据库的简化结构如下所示

users:
    user1: 
       userDetails: 
            name: Everyone
    user2: 
       userDetails:
            name: Needs
    user3: 
       userDetails: 
            name: some
    user4: 
       userDetails:
            name: help
您可以尝试从
用户
节点一次获取所有值,并将它们存储在本地(可能在
列表
中)。然后,在
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);
  }
});
//获取对用户的引用
final FirebaseDatabase=FirebaseDatabase.getInstance();
databasereferef=database.getReference(“您的firebase url/用户”);
//附加侦听器以从firebase数据库读取数据
ref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
List users=dataSnapshot.getValue(User[].class);
调用在此用户(用户)列表中运行的函数;
}
});

Hi Sir感谢您的回答,事实是我从不同的用户那里获得了一个id的Arraylist,我正在尝试对Arraylist中的每个id(我以前已经加载过)执行此操作。我的数据库必须加载所有信息(姓名、电子邮件地址等),我希望您理解我的请求,我将编辑我理解的问题。在这种情况下,您可以开始从数据库加载它们,当调用
onDataChange
时,尝试在单独的列表中添加用户详细信息(例如
list2
)。加载所有数据后,使用
list2
显示用户的详细信息。将调试日志放入代码中,以便更好地理解流程。我希望这能帮上忙。谢谢你的回答,我现在就来试试,我把我的问题编辑好了,想知道!!我很高兴能帮上忙!干杯