在一种方法中调用太多的Firebase函数

时间:2019-07-26 05:07:03

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

我目前正在开发一种方法,该方法允许当前登录的用户注册新用户,并使用firebase将其添加为下线朋友。当我开发此方法时,我意识到我已经将太多的firebase函数膨胀到一个方法中,并且我相信当内部函数出现问题时,这会引起麻烦。

private void ValidateAccount(final String name, final String phone,final String email,
                                 final String password, final String confirmPassword,
                                 final String points,
                                 final DatabaseReference RootRef, final FirebaseAuth firebaseAuth) {

        firebaseAuth.createUserWithEmailAndPassword(email,password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){
                            final FirebaseUser userkey = firebaseAuth.getCurrentUser();
                            final String userkeyString = userkey.getUid();

                            RootRef.child(userkeyString)
                                    .addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if(!(dataSnapshot.exists())){
                                        HashMap<String, Object> userDatamap = new HashMap<>();
                                        final HashMap<String, Object> currentUserDatamap = new HashMap<>();
                                        userDatamap.put("id",userkeyString);
                                        userDatamap.put("phone",phone);
                                        userDatamap.put("name",name);
                                        userDatamap.put("email",email);

                                        userDatamap.put("upline", upline);

                                        addNewDownline(userkeyString);
                                        currentUserDatamap.put("downlines", downlinesMaps);

                                        RootRef.child(userkeyString).updateChildren(userDatamap)
                                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<Void> task) {
                                                        RootRef.child(currentUser.getId()).updateChildren(currentUserDatamap)
                                                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                                    @Override
                                                                    public void onComplete(@NonNull Task<Void> task) {
                                                                        if(task.isSuccessful()){
                                                                            Toast.makeText(RegisterDownlineActivity.this, "Congratulations your account has been created.", Toast.LENGTH_SHORT).show();
                                                                            loadingBar.dismiss();
                                                                            firebaseAuth.signOut();
                                                                            Intent intent =  new Intent(RegisterDownlineActivity.this, HomeActivity.class);
                                                                            startActivity(intent);
                                                                        }
                                                                        else{
                                                                            loadingBar.dismiss();
                                                                            Toast.makeText(RegisterDownlineActivity.this, "Network Error: Please try again.", Toast.LENGTH_SHORT).show();
                                                                        }
                                                                    }
                                                                }).addOnFailureListener(new OnFailureListener() {
                                                            @Override
                                                            public void onFailure(@NonNull Exception e) {
                                                                Toast.makeText(RegisterDownlineActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                                                            }
                                                        });

                                                    }
                                                }).addOnFailureListener(new OnFailureListener() {
                                            @Override
                                            public void onFailure(@NonNull Exception e) {
                                                Toast.makeText(RegisterDownlineActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                                            }
                                        });

                                    }
                                    else{
                                        Toast.makeText(RegisterDownlineActivity.this,"The username already belong to someone else.",Toast.LENGTH_LONG).show();
                                        loadingBar.dismiss();
                                        Toast.makeText(RegisterDownlineActivity.this, "Please try again using another username.", Toast.LENGTH_LONG).show();

                                        Intent intent =  new Intent(RegisterDownlineActivity.this, MainActivity.class);
                                        startActivity(intent);
                                    }
                                }
                                @Override
                                public void onCancelled(@NonNull DatabaseError databaseError) {
                                    Toast.makeText(RegisterDownlineActivity.this, "System Error. Please try again later.", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                        else{
                            Log.d( "FAIL", String.valueOf(task.getException()));
                            Toast.makeText(RegisterDownlineActivity.this, "Authentication failed."+String.valueOf(task.getResult()),
                                    Toast.LENGTH_SHORT).show();
                            loadingBar.dismiss();
                        }
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                try{
                    Toast.makeText(RegisterDownlineActivity.this, "Authentication failed: Email is already being used",
                            Toast.LENGTH_SHORT).show();
                    loadingBar.dismiss();
                }
                catch (RuntimeExecutionException task){
                    Toast.makeText(RegisterDownlineActivity.this, "Authentication failed: Email is already being used",
                            Toast.LENGTH_SHORT).show();
                    loadingBar.dismiss();
                }
            }
        });
    }

例如,如果updateChildren()出了问题,则该方法将在updateChildren()部分显示失败,但是createUserWithEmailAndPassword()仍将执行。

我希望实现的是,每当函数中有错误时,所有函数都不会执行并显示错误。

1 个答案:

答案 0 :(得分:0)

如果执行createUserWithEmailAndPassword()updateChildren()失败,则可以在.addOnFailureListener内删除用户:

.addOnFailureListener(new OnFailureListener() {
   @Override
public void onFailure(@NonNull Exception e) {
  FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
  user.delete();
  Toast.makeText(RegisterDownlineActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
  }
});