【问题标题】:The data from onDataChange() is being fetched a bit late [duplicate]onDataChange() 的数据获取有点晚[重复]
【发布时间】:2021-05-04 01:27:00
【问题描述】:

我想检查是否存在带有特定电子邮件的密钥。如果存在,我需要获取键的值(我的应用程序中用户的唯一 id)并检查在应用程序中输入的 id 是否与从数据库中获取的 id 匹配。但问题是我的 onDataChange() 在我执行相等性检查后响应。可以做什么?

rootRef.child("shortlisted").child(email1).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NotNull DataSnapshot snapshot) {
            try {
                if (snapshot.getValue() != null) {
                    try {

                        aac = snapshot.getValue().toString();
                        System.out.println("STRINGAAC"+aac);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    //user doesnt exist
                    Log.e("TAG", " it's null.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
    System.out.println("STRINGAAC"+aac);
    if(aac.equals("not found"))
    {
        Toast.makeText(globalContext,"not found", Toast.LENGTH_SHORT).show();
    }
    if(aac.equals(aacid_s))
    {
        Toast.makeText(globalContext,"Key Matched value", Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(globalContext,"Key un-Matched value", Toast.LENGTH_SHORT).show();
    }

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

这是正常的行为,因为 firebase API 是异步的,这基本上意味着当您运行上述代码时,onDataChange() 之后的代码甚至会在检索完整数据之前被调用。因此,要解决此问题,您必须执行以下操作:

rootRef.child("shortlisted").child(email1).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NotNull DataSnapshot snapshot) {
            try {
                if (snapshot.getValue() != null) {
                    try {

                        aac = snapshot.getValue().toString();
                        System.out.println("STRINGAAC"+aac);
                        if(aac.equals("not found"))
                        {
                         Toast.makeText(globalContext,"not found", Toast.LENGTH_SHORT).show();
                        }
                        if(aac.equals(aacid_s))
                        {
                         Toast.makeText(globalContext,"Key Matched value", Toast.LENGTH_SHORT).show();
                        }
                        else
                        {
                         Toast.makeText(globalContext,"Key un-Matched value", Toast.LENGTH_SHORT).show();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    //user doesnt exist
                    Log.e("TAG", " it's null.");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });

【讨论】:

  • 实际上我想要进一步处理,所以我不需要任何 toast 消息。它们仅用于调试。无论如何,我可以使用标志变量来做同样的事情,对吧?
  • 如果我尝试用标志变量替换 toast 消息行,我再次面临同样的问题!
  • 我不想干杯,我想根据我的标志变量中的值继续或停止进一步的注册。请帮忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多