2017-10-29 46 views
-3

我有以下注册活动无法正常工作:在用户收到验证电子邮件并尝试登录后,该应用程序崩溃时出现NullPointerException,作为Firebase实时数据库中的新用户条目未创建。不过,我注意到,在调试过程中,如果我在定义generateUser()的地方设置了断点,则会创建一个新的数据库条目(尽管应用程序崩溃了)。只有在Android Studio中设置了断点时才会创建Firebase数据库条目

这里有什么解决办法?

任何帮助将不胜感激。

更新:这里强调的不是NullPointerException,我可以处理该问题。问题是为什么generateUser()没有被调用。

public class SignUpActivity extends AppCompatActivity { 

    private EditText inputUsername, inputEmail, inputPassword; 
    private Button btnSignIn, btnSignUp; 
    private ProgressBar progressBar; 
    private FirebaseAuth auth; 

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

     auth = FirebaseAuth.getInstance(); 
     FirebaseUser user = auth.getCurrentUser(); 

     if (user != null) { 
      if (user.isEmailVerified()) { 
       startActivity(new Intent(SignUpActivity.this, MainActivity.class)); 
       finish(); 
      } 
     } 

     setContentView(R.layout.activity_sign_up); 

     btnSignIn = findViewById(R.id.sign_in_button); 
     btnSignUp = findViewById(R.id.sign_up_button); 
     inputUsername = findViewById(R.id.username); 
     inputEmail = findViewById(R.id.email); 
     inputPassword = findViewById(R.id.password); 
     progressBar = findViewById(R.id.progressBar); 

     btnSignIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(SignUpActivity.this, SignInActivity.class)); 
      } 
     }); 

     btnSignUp.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final String username = inputUsername.getText().toString().trim(); 
       final String email = inputEmail.getText().toString().trim(); 
       final String password = inputPassword.getText().toString().trim(); 

       if (TextUtils.isEmpty(username)) { 
        Toast.makeText(getApplicationContext(), "Enter username!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (TextUtils.isEmpty(email)) { 
        Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (TextUtils.isEmpty(password)) { 
        Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       if (password.length() < 6) { 
        Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       progressBar.setVisibility(View.VISIBLE); 

       auth.createUserWithEmailAndPassword(email, password) 
         .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener<AuthResult>() { 
          @Override 
          public void onComplete(@NonNull Task<AuthResult> task) { 
           progressBar.setVisibility(View.GONE); 
           if (!task.isSuccessful()) { 
            Toast.makeText(SignUpActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); 
           } else { 
            new GenerateUserAsyncTask().execute(username, email, password, 0); 
           } 
          } 
         }); 
      } 

      class GenerateUserAsyncTask extends AsyncTask<Object, Void, Void> { 

       @Override 
       protected Void doInBackground(Object... params) { 
        String username = (String) params[0]; 
        String email = (String) params[1]; 
        String password = (String) params[2]; 
        int score = (int) params[3]; 
        generateUser(username, email, password, score); 
        return null; 
       } 

       @Override 
       protected void onPostExecute(Void result) { 
        sendVerificationEmail(); 
       }} 
     }); 

    } 

    public void sendVerificationEmail() { 
     FirebaseUser user = auth.getCurrentUser(); 

     if (user != null) { 
      user.sendEmailVerification() 
        .addOnCompleteListener(new OnCompleteListener<Void>() { 
         @Override 
         public void onComplete(@NonNull Task<Void> task) { 
          if (task.isSuccessful()) { 
           Toast.makeText(SignUpActivity.this, "Signup successful, verification email sent", Toast.LENGTH_SHORT).show(); 
           auth.signOut(); 
           startActivity(new Intent(SignUpActivity.this, SignInActivity.class)); 
           finish(); 
          } else { 
           Toast.makeText(SignUpActivity.this, "Failed to send email!", Toast.LENGTH_SHORT).show(); 
          } 
          progressBar.setVisibility(View.GONE); 
         } 
        }); 
     } 

    } 

    public void generateUser(String username, String email, String password, int score) { 
     FirebaseDatabase database = Utils.getDatabase(); 
     DatabaseReference users = database.getReference("users"); 
     User user = new User(username, email, password, score); 
     users.child(auth.getUid()).setValue(user); 
    } 
} 
+0

可能重复[什么是NullPointerException,以及如何解决它?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix - ) –

+0

对不起,但我不明白链接的主题如何解释我的问题。 –

回答

0

我找到了解决方案。该问题是由实时数据库安全规则引起的:它们只允许用户在数据库进行身份验证时写入数据库。不过,在我的代码中,调用了generateUser(),用户还没有完全验证。所以我需要在之后在数据库中生成新条目,用户点击了验证邮件中的链接。

相关问题