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幫了我一些。 –