Fix dialog rundown issues causing spurious crashes

This commit is contained in:
Cameron Gutman 2014-07-15 20:46:12 -07:00
parent e2663f06ba
commit d428f342f7
2 changed files with 38 additions and 20 deletions

View File

@ -11,7 +11,7 @@ public class Dialog implements Runnable {
private Activity activity;
private boolean endAfterDismiss;
AlertDialog alert;
private AlertDialog alert;
private static ArrayList<Dialog> rundownDialogs = new ArrayList<Dialog>();
@ -25,13 +25,15 @@ public class Dialog implements Runnable {
public static void closeDialogs()
{
for (Dialog d : rundownDialogs) {
if (d.alert.isShowing()) {
d.alert.dismiss();
synchronized (rundownDialogs) {
for (Dialog d : rundownDialogs) {
if (d.alert.isShowing()) {
d.alert.dismiss();
}
}
}
rundownDialogs.clear();
rundownDialogs.clear();
}
}
public static void displayDialog(Activity activity, String title, String message, boolean endAfterDismiss)
@ -54,16 +56,21 @@ public class Dialog implements Runnable {
alert.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
alert.dismiss();
rundownDialogs.remove(this);
synchronized (rundownDialogs) {
rundownDialogs.remove(this);
alert.dismiss();
}
if (endAfterDismiss)
if (endAfterDismiss) {
activity.finish();
}
}
});
});
rundownDialogs.add(this);
alert.show();
synchronized (rundownDialogs) {
rundownDialogs.add(this);
alert.show();
}
}
}

View File

@ -33,13 +33,15 @@ public class SpinnerDialog implements Runnable,OnCancelListener {
public static void closeDialogs()
{
for (SpinnerDialog d : rundownDialogs) {
if (d.progress.isShowing()) {
d.progress.dismiss();
synchronized (rundownDialogs) {
for (SpinnerDialog d : rundownDialogs) {
if (d.progress.isShowing()) {
d.progress.dismiss();
}
}
}
rundownDialogs.clear();
rundownDialogs.clear();
}
}
public void dismiss()
@ -85,18 +87,27 @@ public class SpinnerDialog implements Runnable,OnCancelListener {
progress.setCancelable(false);
}
progress.show();
synchronized (rundownDialogs) {
rundownDialogs.add(this);
progress.show();
}
}
else
{
if (progress.isShowing()) {
progress.dismiss();
synchronized (rundownDialogs) {
if (rundownDialogs.remove(this) && progress.isShowing()) {
progress.dismiss();
}
}
}
}
@Override
public void onCancel(DialogInterface dialog) {
synchronized (rundownDialogs) {
rundownDialogs.remove(this);
}
// This will only be called if finish was true, so we don't need to check again
activity.finish();
}