2
的肯定按钮

我得到这个错误:走走E/AndroidRuntime:错误报告崩溃android.os.TransactionTooLargeException“上点击AlertDialog

E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException 

这也太:

java.lang.StackOverflowError: stack size 8MB 

同时运行下面给出的代码:

mAuthListener = new FirebaseAuth.AuthStateListener() { 
       @Override 
       public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
        final FirebaseUser user = firebaseAuth.getCurrentUser(); 
        if (user != null) { 
         // User is signed in 

         if (isFacebookLoggedIn()) { 

          if (dialog == null) { 

           final AlertDialog.Builder builder = new AlertDialog.Builder(SignUpActivity.this); 

           LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
           View alertDialogView = inflater.inflate(R.layout.choose_unique_name_dialog, null); 
           uniqueUserName = (EditText) alertDialogView.findViewById(R.id.uniqueUserName); 
           usernameChoosen = (TextView) alertDialogView.findViewById(R.id.usernameChoosen); 
           usernameWarning = (TextView) alertDialogView.findViewById(R.id.usernameWarning); 

           usernameChoosen.setVisibility(View.INVISIBLE); 
           usernameWarning.setVisibility(View.INVISIBLE); 

           builder.setTitle("Choose a unique username"); 
           builder.setView(alertDialogView); 
           builder.setPositiveButton("Continue", new DialogInterface.OnClickListener() { 
            @Override 
            public void onClick(DialogInterface dialogInterface, int i) { 

            } 
           }); 
           dialog = builder.create(); 
          } 
          dialog.show(); 
          dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            wantToCloseDialog = false; 
            //Do stuff, possibly set wantToCloseDialog to true then... 
            if (uniqueUserName.getText().toString().isEmpty()) { 

             Toast.makeText(getBaseContext(), "Please choose a unique username", Toast.LENGTH_LONG).show(); 
             wantToCloseDialog = false; 
            } else { 

             mDatabase.child("unique-usernames").addValueEventListener(new ValueEventListener() { 
              @Override 
              public void onDataChange(DataSnapshot dataSnapshot) { 
               if (dataSnapshot.getValue() != null) { 
                if (dataSnapshot.getValue().toString().contains(uniqueUserName.getText().toString())) { 
                 Toast.makeText(getBaseContext(), uniqueUserName.getText().toString() + " is already taken", Toast.LENGTH_LONG).show(); 
                 usernameChoosen.setText(uniqueUserName.getText().toString()); 
                 wantToCloseDialog = false; 
                } else { 

                 // error is happening on execution of this code 

                 Log.d("signedIn", "onAuthStateChanged:signed_in:" + user.getUid()); 
                 mDatabase.child("users").child(user.getUid()).child("name").setValue(user.getDisplayName()); 
                 mDatabase.child("users").child(user.getUid()).child("imageUID").setValue(user.getPhotoUrl()); 
                 mDatabase.child("users").child(user.getUid()).child("uniqueUserName").setValue(uniqueUserName.getText().toString()); 
                 mDatabase.child("users").child(user.getUid()).child("followers").setValue("00"); 
                 mDatabase.child("users").child(user.getUid()).child("following").setValue("00"); 
                 mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString()); 
                 Intent mainIntent = new Intent(SignUpActivity.this, SplashActivity.class); 
                 mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
                 mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
                 startActivity(mainIntent); 
                 progressDialog.setMessage("Signing up..."); 
                 progressDialog.setCancelable(false); 
                 progressDialog.show(); 
                 wantToCloseDialog = true; 
                } 
               } else { 
                Log.d("signedIn", "onAuthStateChanged:signed_in:" + user.getUid()); 
                mDatabase.child("users").child(user.getUid()).child("name").setValue(user.getDisplayName()); 
                mDatabase.child("users").child(user.getUid()).child("imageUID").setValue(user.getPhotoUrl()); 
                mDatabase.child("users").child(user.getUid()).child("uniqueUserName").setValue(uniqueUserName.getText().toString()); 
                mDatabase.child("users").child(user.getUid()).child("followers").setValue("00"); 
                mDatabase.child("users").child(user.getUid()).child("following").setValue("00"); 
                mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString()); 
                Intent mainIntent = new Intent(SignUpActivity.this, SplashActivity.class); 
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
                startActivity(mainIntent); 
                progressDialog.setMessage("Signing up..."); 
                progressDialog.setCancelable(false); 
                progressDialog.show(); 
                wantToCloseDialog = true; 
               } 
              } 
              @Override 
              public void onCancelled(DatabaseError databaseError) { 
               Snackbar snackbar = Snackbar 
                 .make(coordinatorLayout, databaseError.getMessage(), Snackbar.LENGTH_LONG); 
               snackbar.show(); 
               wantToCloseDialog = false; 
              } 
             }); 
            } 
            if(wantToCloseDialog) 
             dialog.dismiss(); 
            //else dialog stays open. Make sure you have an obvious way to close the dialog especially if you set cancellable to false. 
           } 
          }); 
         } else { 

          Log.d("signedIn", "onAuthStateChanged:signed_in:" + user.getUid()); 
          mDatabase.child("users").child(user.getUid()).child("name").setValue(userName.getText().toString()); 
          mDatabase.child("users").child(user.getUid()).child("uniqueUserName").setValue(uniqueUserName.getText().toString()); 
          mDatabase.child("users").child(user.getUid()).child("followers").setValue("00"); 
          mDatabase.child("users").child(user.getUid()).child("following").setValue("00"); 
          mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString()); 
          Intent mainIntent = new Intent(SignUpActivity.this, SplashActivity.class); 
          mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
          startActivity(mainIntent); 
          progressDialog.dismiss(); 

         } 
        } else { 
         // User is signed out 
         Log.d("signedOut", "onAuthStateChanged:signed_out"); 
        } 
        // ... 
       } 
      }; 

我从来没有见过这样的错误之前,这就是为什么我不知道什么是'在这里发生。

请让我知道什么是造成这个错误!

+0

对于您的对话框中的肯定按钮,您有两个OnClick监听器。这可能是导致错误的原因。 –

+0

删除其中一个没有帮助。 :/ –

回答

2

在深入研究代码至少10-12次之后,我在这里遇到了问题。

解决的办法是用user.getPhotoUrl()在这行代码添加.toString()mDatabase.child("users").child(user.getUid()).child("imageUID").setValue(user.getPhotoUrl());

这个答案here给我一点提示。谢谢qbix

所以,现在已经解决了!

0

您正在为节点mDatabase.child("unique-usernames")添加侦听器。然后在onDataChange()回调为听众,您正在修改同一节点的子:

mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString()); 

这将导致侦听器回调再次触发,导致死循环。

+0

谢谢,但你的这个答案:http://stackoverflow.com/a/38128667/6144372帮了我一些。 –