当前位置: 首页 > 知识库问答 >
问题:

第一次快照后ArrayList变为空

年光明
2023-03-14

我正在使用android应用程序中的Firebase,发生了一些奇怪的事情,在我的示例中,我需要两个快照,1以获取列表中的用户(我使用此快照用用户的键填充字符串数组列表)和另一个与用户进行比较,奇怪的行为是我的数组列表在第一个快照后为空,我使用logcat检查它,并且第一个快照中的Log返回我1作为数组列表的大小,第二个返回我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个答案

夹谷山
2023-03-14

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

如需其他方法,请访问此帖子和此帖子。

希望有帮助。

 类似资料:
  • 1. 我看你项目里涉及多线程,那你对Java线程池应该有一定了解吧,说一下线程池都有哪些参数,然后任务创建的流程是怎么样的     balabala 2. 在多线程这块,你在使用Java容器的时候是怎么用的,用Map举个例子     ConcurrentHashMap==>CAS+sychronized,HashMap + sychronized 3. 看了你的项目,有10w的设备,那你这个数据量

  • Overview Rados supports two related snapshotting mechanisms: pool snaps: snapshots are implicitely applied to all objects in a pool self managed snaps: the user must provide the current SnapContext on

  • 我有一个函数,当单击搜索表单上的按钮时,它会被调用。我们得到字符串并检查它以确保它只是字母。然后我们检查球员的名字是否已经在数据库中,如果不是,我们添加他。如果他在数据库中,我们转到语句的else部分。这工作得很好--但是在我的其他区域,当我们确定数据库中有一个名字完全相同的玩家时,我想要为该玩家操作数据库中的一个特征。具体地说,在玩家投票计数中加上1。 我的火力点是这样布置的:

  • 问题内容: 我正在尝试将名为 City 的 类的 对象添加到中。这是该类的代码 __ 这是我的 主班 的代码 __ 的结果始终相同,并且似乎 数组列表 仅存储添加到其所有元素中的最后一个对象。 例如,运行程序时得到的结果是: 为什么我得到那个结果?我该如何解决? 提前致谢! 问题答案: 在和变量被标记为。甲构件跨过的所有实例共享,并且因此是一个全局变量。您需要对代码进行几处更改: 将city中的和

  • 大型软件应用程序通常由多个模块组成,并且通常情况下,多个团队正在处理同一应用程序的不同模块。 例如,考虑一个团队正在作为app-ui项目(app-ui.jar:1.0)在应用程序的前端工作,他们正在使用数据服务项目(data-service.jar:1.0)。 现在可能发生的是,从事数据服务的团队正在快速进行错误修复或增强,他们几乎每隔一天就将库发布到远程存储库。 现在,如果数据服务团队每隔一天上

  • 问题内容: 我有一个简单的AJAX表单,该表单可以在提交时正常运行。但是,如果我随后将新数据输入相同的表单(而不刷新页面),则它将提交两次表单。如果我第三次这样做,那么它将第三次提交表单,依此类推。为什么这样做呢?这是我的代码: 问题答案: 即使我在开发AJAX登录表单时也遇到了同样的问题。搜寻了几个小时后,我找到了解决方案。希望这对您有所帮助。 基本上,您必须在ajax请求完成后 取消绑定 表单