android - 我需要等到监听器将 bool 值从 null 更改为 false/true java

标签 android firebase firebase-realtime-database listener

我有一个 Firebase 监听器,它检查用户是否存在(我正在使用 Firebase 数据库进行登录/注册)以判断用户名是否已被占用,问题是它需要点击 2 次注册按钮才能工作,因为监听器无法判断用户名是否存在或速度不够快,只有当它已经决定第一次点击时第二次点击才可以注册,但它又不会真正检查第二次点击的用户名(如果我立即更改用户名,即使已被使用也能正常工作)

database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
                clear = false;
            }else
                clear = true;
        }
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            clear = false;
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });

    //insert check if clear has value

    if(!clear) //TODO FIX takes time to the listener to do the job
        return false;

clear 是一个 bool 型var,第一次运行时为null,此代码用于检查用户名是否被占用

最佳答案

也许你的代码是这样的:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (checkUserExists()) {
                ...
            } else {
                signUp();
            }
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
                clear = false;
            }else
                clear = true;
        }
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            clear = false;
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });

    //insert check if clear has value

    if(!clear) //TODO FIX takes time to the listener to do the job
        return false;
}

private void signUp() {
    ...
}

你应该把它改成:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            checkUserExists();
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
            } else {
                signUp(); // sign up here
            }
        }
        @Override
        public void onCancelled(DatabaseError error) {
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });
}

private void signUp() {
    ...
}

您还可以在检查用户数据时阻止用户输入:

private boolean checking = false; // added

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    signUpBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (checking) return; // added
            checkUserExists();
            checking = true; // added
        }
    }
}

private boolean checkUserExists() {
    database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("Users/" +    usernameEt.getText().toString() +"/password");
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            checking = false; // added
            String value = dataSnapshot.getValue(String.class);
            if(value != null) {
                Toast.makeText(getApplicationContext(), "Username Taken", Toast.LENGTH_SHORT).show();
            } else {
                signUp(); // sign up here
            }
        }
        @Override
        public void onCancelled(DatabaseError error) {
            checking = false; // added
            Toast.makeText(getApplicationContext(), "Internet Error", Toast.LENGTH_SHORT).show();
        }
    });
}

private void signUp() {
    ...
}

希望它有用。

关于android - 我需要等到监听器将 bool 值从 null 更改为 false/true java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41561723/

相关文章:

android - 菜单项未显示在操作栏上

javascript - 如何观察 Firebase 存储上传事件

ios - 在 iOS 上 native 找不到 RNFirebase 核心模块 - 未修复

ios - 如何禁用 Firebase 实时数据库 iOS 离线写入

Flutter - 删除实时 Firebase 数据 onTap()

java - android - OnClickListener 不适用于 recyclerview 中的第一次点击

android - 有没有办法在 Android 中重新编码 MP3 或任何其他音频文件?

reactjs - Firebase - 预检响应中的 Access-Control-Allow-Headers 不允许请求 header 字段 x-firebase-gmpid

javascript - 是否可以撤销 Firebase 列表?

java - OpenGL ES 只绘制一个三角形