首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何暂停ListIterator

如何暂停ListIterator
EN

Stack Overflow用户
提问于 2020-10-21 06:07:53
回答 1查看 25关注 0票数 0

我正在使用Firebase数据库来存储我的用户游戏分数,在游戏结束时,用户可以看到每个成员的最终结果

我的用户数据和他们的分数存储在两个不同的位置

下面是我在Firebase中的结构。

代码语言:javascript
复制
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数据库加载必要的数据,然后恢复它自己?

我的代码

代码语言:javascript
复制
  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 
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 06:41:20

你不能按你想要的方式暂停列表迭代器。让我来解释一下。

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

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

代码语言:javascript
复制
users:
    user1: 
       userDetails: 
            name: Everyone
    user2: 
       userDetails:
            name: Needs
    user3: 
       userDetails: 
            name: some
    user4: 
       userDetails:
            name: help

您可以尝试一次从users节点获取所有值,并将它们存储在本地(可能存储在List<User>中)。然后,在onDataChange函数中正确下载用户列表后,使用单独的方法触发列表迭代器,以便它可以遍历本地存储的列表,并为您提供所需的结果。

下面是一个伪实现。

代码语言:javascript
复制
// 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);
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64454013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档