2017-10-29 47 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(),用戶還沒有完全驗證。所以我需要在之後在數據庫中生成新條目,用戶點擊了驗證郵件中的鏈接。

相關問題