单击 AlertDialog 的肯定按钮获得 'E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException'
Getting 'E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException' on clicking a Positive button of AlertDialog
我收到此错误:
E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException
还有这个:
java.lang.WhosebugError: 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");
}
// ...
}
};
我以前从未见过任何此类错误,这就是为什么我不知道这里发生了什么。
请告诉我是什么导致了这个错误!
您正在为节点 mDatabase.child("unique-usernames")
添加侦听器。然后在该侦听器的 onDataChange()
回调中,您正在修改同一节点的子节点:
mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString());
这会导致侦听器回调再次触发,从而导致死循环。
深入研究代码至少 10-12 次后,我发现了这里的问题。
解决方案是在这行代码中添加 .toString()
和 user.getPhotoUrl()
:mDatabase.child("users").child(user.getUid()).child("imageUID").setValue(user.getPhotoUrl());
这个回答 gave me a bit hint. Thanks qbix。
那么,现在已经解决了!
我收到此错误:
E/AndroidRuntime: Error reporting crash android.os.TransactionTooLargeException
还有这个:
java.lang.WhosebugError: 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");
}
// ...
}
};
我以前从未见过任何此类错误,这就是为什么我不知道这里发生了什么。
请告诉我是什么导致了这个错误!
您正在为节点 mDatabase.child("unique-usernames")
添加侦听器。然后在该侦听器的 onDataChange()
回调中,您正在修改同一节点的子节点:
mDatabase.child("unique-usernames").child(ts).setValue(uniqueUserName.getText().toString());
这会导致侦听器回调再次触发,从而导致死循环。
深入研究代码至少 10-12 次后,我发现了这里的问题。
解决方案是在这行代码中添加 .toString()
和 user.getPhotoUrl()
:mDatabase.child("users").child(user.getUid()).child("imageUID").setValue(user.getPhotoUrl());
这个回答
那么,现在已经解决了!