值事件侦听器在每个活动中正常工作。但在我的注册活动中,它花了超过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引用只包含用户名作为子级,然后包含其所有信息。所以我只想检查用户名是否存在。
正如我所说,除了这门课以外,它通常无处不在。 请帮忙..
答案 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}}操作。
代码中的条件似乎是反转的:当数据显示用户不存在时,打印用户不存在。但是由于你的片段中存在相同的逻辑,我决定不修改它。