使用null上下文创建alertDialog时,应用程序崩溃

时间:2017-09-25 08:19:24

标签: java android alertdialog

我是一名新的Android开发人员,最近遇到了一个问题。

背景是我需要在后端asyncTask完成时显示AlertDialog。但是,在很长一段时间asyncTask之后,活动可能 GC ,因此AlertDialog的输入参数的上下文为null。是否有解决此问题的解决方法。

我使用此功能显示对话框:

public static Dialog showDialog(
            Context ctx, int themeId, String title, String message,
            int okStrId, android.content.DialogInterface.OnClickListener okListener,
            int cancelStrId, android.content.DialogInterface.OnClickListener cancelListener) {
        if (ctx != null) {
            AlertDialog.Builder builder;
            if (themeId > 0)
                builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, themeId));
            else
                builder = new AlertDialog.Builder(ctx);
            if (title != null)
                builder.setTitle(title);
            builder.setMessage(message);
            builder.setPositiveButton(ctx.getString((okStrId < 0) ? R.string.ok : okStrId),
                    (okListener != null) ? okListener : sDefaultDialogListener);
            if (cancelListener != null)
                builder.setNegativeButton(ctx.getString((cancelStrId < 0) ? R.string.cancel : cancelStrId), cancelListener);
            else {
                builder.setCancelable(false);
            }
            AlertDialog ad = builder.create();
            ad.show();
            return ad;
        }else {
            Context context = SuccessFactorsApp.getAppContext();
            DialogActivity.launchActivity(ctx,themeId,title,message,okStrId,okListener,cancelStrId,cancelListener);
            return new AlertDialog.Builder(context).create();
        }
    }

我尝试使用Activity来模拟对话框但不确定如何处理DialogInterface.OnClickListener

2 个答案:

答案 0 :(得分:0)

将此添加到您的代码中:

if(!((Activity) context).isFinishing())
{
    //show dialog
}

答案 1 :(得分:0)

运行asyntask并执行后台活动时会被杀死并收集垃圾。完成任务后,您无法显示没有活动的对话框。您可以尝试

1.通过添加以下权限显示您的对话框。将此权限添加到清单

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

在显示对话框时,在dialog.show()

之前添加这行代码
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

2.完成任务启动所需活动和打开应用程序

3.使用Toast而不是对话框。