DatabaseSnapshot同时执行if和else

时间:2020-03-15 10:23:27

标签: android firebase firebase-realtime-database

我正在使用Firebase进行身份验证,并且在“注册活动”中,我要检查用户名是否已从结构如下的数据库中获取:

Users
  |
  |
  |
  ----userID
        |-----"username"="exampleusername"

我的代码可以识别用户名是否已被使用,并返回Toast消息并且不创建用户,问题是如果用户名未被使用,它还会显示此消息,但是帐户已创建。有人知道我在做什么错吗?

public class SignUpActivity extends AppCompatActivity {


    private EditText emailTV, passwordTV, usernameTV, fullnameTV;
    private ImageButton regBtn;
    private ProgressBar progressBar;
    private FirebaseAuth mAuth;
    private static FirebaseAnalytics firebaseAnalytics;
    DatabaseReference reference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        mAuth = FirebaseAuth.getInstance();

        initializeUI();

        regBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                usernamecheck();
            }
        });
        final TextView signup_button = findViewById(R.id.back_button);
        signup_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                startActivity(intent);
            }
        });
    }


    private void usernamecheck() {
        String username;
        username = usernameTV.getText().toString();
        DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Users");
        ref.orderByChild("username").equalTo(username).addValueEventListener(new ValueEventListener(){
            @Override
            public void onDataChange(DataSnapshot dataSnapshot){
                if(!dataSnapshot.exists()) {
                    registerNewUser();
                    return;
                }
                else{
                    userexists();
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

    private void userexists(){
        Toast.makeText(getApplicationContext(), getString(R.string.usernameexists), Toast.LENGTH_LONG).show();
    }

    private void registerNewUser() {
        progressBar.setVisibility(View.VISIBLE);

        String email, password, username, fullname;
        fullname = fullnameTV.getText().toString();
        email = emailTV.getText().toString();
        password = passwordTV.getText().toString();
        username = usernameTV.getText().toString();

        if (TextUtils.isEmpty(fullname)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingfullname), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(username)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingusername), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(email)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingmail), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(getApplicationContext(), getString(R.string.missingpassword), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
            return;
        }

        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {

                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            String userid = user.getUid();
                            reference = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);

                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("id", userid);
                            hashMap.put("username", username.toLowerCase());
                            hashMap.put("fullname", fullname);
                            hashMap.put("bio", "");
                            hashMap.put("imageurl", "https://firebasestorage.googleapis.com/v0/b/frooze-b2248.appspot.com/o/default.png?alt=media&token=aaf52a37-7043-4685-b91f-c6cccda88f4e");
                            reference.setValue(hashMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()){
                                        // Verification Mail
                                        sendVerificationEmail();
                                        FirebaseAuth.getInstance().signOut();
                                        progressBar.setVisibility(View.GONE);
                                        Intent intent = new Intent(SignUpActivity.this, LoginActivity.class);
                                        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                        startActivity(intent);
                                    }
                                }
                            });

                        }
                        else {
                            // If registration fails
                            Toast.makeText(getApplicationContext(), getString(R.string.registrationfail), Toast.LENGTH_LONG).show();
                            progressBar.setVisibility(View.GONE);
                        }
                    }
                });
    }
    public void sendVerificationEmail() {
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // if User logged in
        if (user != null) {
            // Sends verify Mail
            user.sendEmailVerification()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                Toast.makeText(getApplicationContext(), getString(R.string.registrationsuccessful), Toast.LENGTH_LONG).show();

                            }
                        }
                    });
        }

    }
    private void initializeUI() {
        fullnameTV = findViewById(R.id.fullname);
        emailTV = findViewById(R.id.email);
        usernameTV = findViewById(R.id.username);
        passwordTV = findViewById(R.id.password);
        regBtn = findViewById(R.id.register);
        progressBar = findViewById(R.id.progressBar);
    }
}

谢谢。

1 个答案:

答案 0 :(得分:2)

您正在使用addValueEventListeneronDataChange,这意味着当添加或更改变量时,将执行侦听器。 addValueEventListener继续监听附加的查询或数据库引用。

如果只想一次,则必须使用其他侦听器。另一个侦听器是addListenerForSingleValueEvent,该侦听器执行一次onDataChange方法,然后停止侦听附加到该引用的引用。