Firebase Valueeventlistener花了这么多时间

时间:2017-07-01 16:47:40

标签: java android firebase firebase-realtime-database

值事件侦听器在每个活动中正常工作。但在我的注册活动中,它花了超过2分钟。我不知道为什么。

这是我的方法

  private void verifyuserinput() {


        System.out.println("Verifying User Input");
        userRef.addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
                System.out.println("Verifying Username");

                if (dataSnapshot.hasChild(username.getText().toString())){
                    Toast.makeText(Signup.this, "Username doesn't exist", Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

这是我的完整注册码 https://pastebin.com/fidvpRLE

两张照片之间的时差为2分钟+

同样在这两分钟内它消耗了如此多的数据。像持续2分钟每秒1MBps一样。

日志

07-01 21:56:25.315 21504-21504/com.aye.chat I/System.out: Verifying User Input
07-01 21:58:01.960 21504-21504/com.aye.chat I/System.out: Verifying Username

有时差。

firebase引用只包含用户名作为子级,然后包含其所有信息。所以我只想检查用户名是否存在。

正如我所说,除了这门课以外,它通常无处不在。 请帮忙..

1 个答案:

答案 0 :(得分:2)

您正在下载userRef.child(username.getText().toString()).addListenerForSingleValueEvent(new com.google.firebase.database.ValueEventListener() { @Override public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) { System.out.println("Verifying Username"); if (dataSnapshot.exists()){ Toast.makeText(Signup.this, "Username doesn't exist", Toast.LENGTH_SHORT).show(); } } @Override public void onCancelled(DatabaseError databaseError) { throw databaseError.toException(); // don't ignore errors } }); 下的所有数据,以验证此特定用户是否存在。这是浪费和更糟糕的:当你有更多的用户时,它会浪费更多的数据。

要验证特定用户是否存在,您应该寻找只需要您读取单个用户节点的解决方案。从查看当前代码,可以通过以下方式完成:

O(n)

上面的代码将JSON树中较低级别的侦听器附加到您尝试检查的节点上。这会将其从O(1)更改为{{1}}操作。

代码中的条件似乎是反转的:当数据显示用户不存在时,打印用户不存在。但是由于你的片段中存在相同的逻辑,我决定不修改它。