2
의 긍정적 버튼

나는이 오류를 받고 있어요 클릭에얻기 'E/AndroidRuntime : 오류 충돌 android.os.TransactionTooLargeException을보고'너무</p> <pre><code>E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException </code></pre> <p>이 :에 AlertDialog

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 Listener가 있습니다. 이것은 아마도 오류의 원인입니다. –

+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 나를 조금 도와 줬어. –