android - 如何检查电子邮件或手机是否已在 Firebase 中注册

标签 android firebase firebase-realtime-database firebase-authentication

我想在 firebase 的帮助下实现两个 Activity 的注册,第一个注册 Activity 包含电子邮件手机和密码,在这个 Activity 中我想检查输入的电子邮件 ID 或手机是否已注册,如果它然后不会将数据(即电子邮件、手机号码和密码)移动到将进行最终注册的下一个 Activity 。代码中存在的两种方法,即 userMobileExists() 和 userEmailExists() 用于检查电子邮件和手机。但问题是这些是异步的,所以当我进入下一个 Activity 时,Toast 显示电子邮件已经注册。 我正在返回有效值,如果所有有效值都为真,那么它会转到下一个 Activity ,我对其进行调试并在进入方法之前返回有效值。这是因为异步代码,请建议如何仅在第一个 Activity 中实现它。或者告诉我是否应该提供整个代码。

 public class SignupActivity extends AppCompatActivity {
    private static final String TAG = "SignupActivity";
    private static final int REQUEST_SIGNUP = 0;

    private Firebase mRef = new Firebase("https://abcdef.firebaseio.com/");
    private User user;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private ProgressDialog mProgressDialog;
    boolean valid = true;
    String email;
    String mobile;
    String password;

    @Bind(R.id.input_email)
    EditText _emailText;
    @Bind(R.id.input_mobile)
    EditText _mobileText;
    @Bind(R.id.input_password)
    EditText _passwordText;
    @Bind(R.id.btn_next)
    Button _signupButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_signup);
        ButterKnife.bind(this);

        //For Full screen
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        mAuth = FirebaseAuth.getInstance();

        //Back button initialization
        Button backButton = (Button) findViewById(R.id.back_signup);
        backButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent in = new Intent(view.getContext(), LoginActivity.class);
                startActivity(in);
            }
        });

        mAuth = FirebaseAuth.getInstance();
        // mRef = Firebase(Config.FIREBASE_URL);


        _signupButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signup();
            }
        });

    }

    protected void setUpUser() {

        user.setPhoneNumber(_mobileText.getText().toString());
        user.setEmail(_emailText.getText().toString());
        user.setPassword(_passwordText.getText().toString());
    }

    //private void

    public void signup() {
        Log.d(TAG, "Signup");
        //showProgressDialog();
        if (validate() && userEmailExist() && userMobileExist()) {
            onSignupSuccess();

        } else {
            onSignupFailed();
            return;
        }

        //_signupButton.setEnabled(false);

        email = _emailText.getText().toString();
        mobile = _mobileText.getText().toString();
        password = _passwordText.getText().toString();


        // TODO: Implement your own signup logic here.


    }


    public void onSignupSuccess() {
        //_signupButton.setEnabled(true);
        Log.d(TAG, "NEXT        BUTTTON");
        //hideProgressDialog();
        Intent in = new Intent(this, SignupActivity2.class);
        in.putExtra("Email", _emailText.getText().toString());
        in.putExtra("Mobile", _mobileText.getText().toString());
        startActivity(in);

        /*setResult(RESULT_OK, null);
        finish();*/
    }

    public void onSignupFailed() {

        // hideProgressDialog();
        Toast.makeText(getBaseContext(), "SignUp failed", Toast.LENGTH_LONG).show();

        // _signupButton.setEnabled(true);
    }

    public boolean validate() {


        email = _emailText.getText().toString();
        mobile = _mobileText.getText().toString();
        password = _passwordText.getText().toString();

        if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            _emailText.setError("enter a valid email address");
            valid = false;
        } else {
            _emailText.setError(null);
        }

        if (mobile.isEmpty() || mobile.length() != 10) {
            _mobileText.setError("Enter Valid Mobile Number");
            valid = false;
        } else {
            _mobileText.setError(null);
        }

        if (password.isEmpty() || password.length() < 4 || password.length() > 10) {
            _passwordText.setError("between 4 and 10 alphanumeric characters");
            valid = false;
        } else {
            _passwordText.setError(null);
        }
        return valid;
    }

    public boolean userEmailExist() {
        //private Firebase mRef = new Firebase("https://.firebaseio.com/users/");
        mRef.child("users").orderByChild("email").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue()== _emailText.getText().toString()) {

                    Toast.makeText(getBaseContext(), "Email already exist. Please choose a different one", Toast.LENGTH_SHORT).show();
                    _emailText.setError("Email already exist. Please choose a different one");
                    valid = false;
                } else {
                    email = _emailText.getText().toString();
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });
        return valid;
    }

    public boolean userMobileExist() {
        mRef.child("users").
                orderByChild("cellPhone").equalTo(_mobileText.getText().toString()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    _mobileText.setError("Mobile Number already exist");
                    valid = false;
                } else {
                    mobile = _mobileText.getText().toString();

                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });


        return valid;
    }


    @Override
    public void onBackPressed() {
        // Disable going back to the MainActivity
        moveTaskToBack(true);
    }

    public void showProgressDialog(){
        if(mProgressDialog == null){
            mProgressDialog = new ProgressDialog(this);
            mProgressDialog.setMessage("loading");
            mProgressDialog.setIndeterminate(true);
        }
        mProgressDialog.show();
    }

    public void hideProgressDialog(){

        if(mProgressDialog != null && mProgressDialog.isShowing()){
            mProgressDialog.dismiss();
        }
    }
}

最佳答案

您需要掌握回调的概念。您不能返回异步分配的变量。

作为快速解决问题的方法,从界面开始

public interface OnUserActionListener {
    void onExists(Boolean exists);
} 

然后,让你的方法无效并接受一个参数

public void userEmailExist(final String email, final OnUserActionListener listener) {
    mRef.child("users")
        .orderByChild("email")
        .equalTo(email)
        .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        listener.onExists( dataSnapshot.exists() );
    }

    ... 

    // no return statement 
} 

然后,当您调用该方法时,您可以传入要搜索的字符串值,并实现您的接口(interface)。

所以替换这段同步代码

validate() && userEmailExist()

使用异步版本

if (validate()) { // This is synchonous
    final String email = _emailText.getText().toString();
    final String mobile = _mobileText.getText().toString(); 

    // This is asynchronous
    userEmailExist(email, new OnUserActionListener() {
        @Override 
        public void onExists(Boolean exists) {
            if (exists) {
                Toast.makeText(getBaseContext(), "Email already exist. Please choose a different one", Toast.LENGTH_SHORT).show();
                _emailText.setError("Email already exist. Please choose a different one");
                onSignupFailed();
            } else {
                onSignupSuccess();
            }
        } 

    }); 

无论您选择如何定义该接口(interface)都取决于您

再次重申,不要在回调中分配字段 valid。尽力实现所有需要回调本身值的逻辑


您还可以在类上实现整个接口(interface),在这种情况下我建议将其作为 SignUpActivity,因为您想要监听用户事件操作,例如成功或错误

只是一个使用你已有的方法名的例子

public interface OnUserActionListener {
    // Combine the email and phone into one action
    void onUserExists(User user, Boolean exists); 
    void onSignupSuccess(User user);
    void onSignupFailed(String reason);
} 

public class SignupActivity extends AppCompatActivity 
   implements OnUserActionListner {   // Implement this interface

   // Define the needed methods
   @Override
   public void onUserExists(User user, Boolean exists) {
       if (exists) {
           onSignupFailed("User " + user + " already exists");
       } else {
           onSignupSuccess(user);
       }
   }

   @Override
   public void onSignupSuccess(User user) {
       // Do something
   }

   @Override
   public void onSignupFailed(String reason) {
       Toast.makeText(this, reason, Toast.LENGTH_SHORT).show();
   }

   @Override
   protected void onCreate(Bundle b) {
       ... 
   }

等等等

然后,其他方法调用就变成了。

if (validate()) { // This is synchonous
    final String email = _emailText.getText().toString();
    final String mobile = _mobileText.getText().toString(); 

    // This is asynchronous & you defined the Activity as the interface
    userEmailExist(email, SignupActivity.this); 

关于android - 如何检查电子邮件或手机是否已在 Firebase 中注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44530976/

相关文章:

java - SWIG C 函数指针和 JAVA

java - android Intent 服务中的计时器

android - Espresso 测试 Android API 28 模拟器点击问题

node.js - FIREBASE警告:用户回调引发了异常。 TypeError:req.next不是函数

android - 将数据添加到 Firebase 实时数据库列表的最佳方法是什么

android - 如何使用 Android DataBinding 库在屏幕方向变化时保持用户输入?

javascript - TypeError : firebase. 存储不是函数

java - 任务 com.google.firebase.a.v 被 java.util.concurrent.ThreadPoolExecutor 拒绝

firebase - 如何使用 Firebase 的新 Bolt 编译器定义索引

android - firebase 监听器在哪里监听 RAM 或磁盘?