View.performClick AlertController.onClick中的android ClassCastException

时间:2016-09-16 09:26:42

标签: android alertdialog

Hello Stakcoverflowers,

这是我的第一个问题,因为stackoverflow是如此丰富,到现在为止,我总是找到我的问题的答案而不问,Stackoverflow的荣誉!

回到主题,

最近我发现了奇怪的崩溃日志。

这是堆栈跟踪:

Fatal Exception: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean
   at com.android.internal.app.AlertController$1.onClick(AlertController.java:150)
   at android.view.View.performClick(View.java:4848)
   at android.view.View$PerformClick.run(View.java:20262)
   at android.os.Handler.handleCallback(Handler.java:815)
   at android.os.Handler.dispatchMessage(Handler.java:104)
   at android.os.Looper.loop(Looper.java:194)
   at android.app.ActivityThread.main(ActivityThread.java:5637)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

我有4种这样的错误,发生4-7次,共发生20次。这就是为什么我们不能忽视它。

4种bug的区别在于堆栈竞赛的第3行和以下。

其他3个

at android.view.View.performClick(View.java:4463)

at android.view.View.performClick(View.java:5265)

at android.view.View.performClick(View.java:5273)

看到错误是AlertController的最后一个类,我认为问题与AlertDialog有关,但没有足够的证据。

奇怪的是,它只发生在Infinix系列设备上。

我依赖于搜索堆栈溢出和谷歌而没有运气。

有没有人遇到同样的错误? 谁知道问题是什么?

感谢您的提前帮助

最后,如果我的英语不好,我很抱歉,因为这不是我的母语

编辑1

I User Factory类创建对话框,如下所示

public class DialogFactory 
{
    public static AlertDialog createDialog(Context context, String title, String content, String positive, String negative, DialogInterface.OnClickListener listener) 
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(context).setTitle(title).setMessage(content).setCancelable(false);

        if (positive != null)
        {
            builder.setPositiveButton(positive, listener);
        }

        if (negative != null)
        {
            builder.setNegativeButton(negative, listener);
        }

        return builder.create();
    }

    public static AlertDialog createDialog(Context context, String title, String[] content, String positive, String negative, DialogInterface.OnClickListener listener)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(context).setTitle(title).setItems(content, listener).setCancelable(false);

        if (positive != null)
        {
            builder.setPositiveButton(positive, listener);
        }

        if (negative != null)
        {
            builder.setNegativeButton(negative, listener);
        }

        return builder.create();
    }
}

并在我的活动中将其称为以下内容,即实现DialogInterface.OnClickListener:

AlertDialog dialog = DialogFactory.createDialog(this, title, content, positive, negative, this);

if (!isFinishing())
{
    dialog.show();
}

编辑2

抱歉忘了我有其他类型的实施。 以下是其他类型的实现:

AlertDialog dialog = DialogFactory.createDialog(this, title, content, positive, negative, this);

if (!isFinishing())
{
    dialog.show();
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTag(NOT_CONNECTED_DIALOG);
}

其中NOT_CONNECTED_DIALOG是整数常量。 也许它的帮助?

编辑3

Grep Code,我找到了Android 5.1的AlertController源代码,因为第一个堆栈跟踪来自android 5.1,如下所示

private static final class More ...ButtonHandler extends Handler {
    // Button clicks have Message.what as the BUTTON{1,2,3} constant
    private static final int MSG_DISMISS_DIALOG = 1;

    private WeakReference<DialogInterface> mDialog;
    // <--- line 150 is here???
    public More ...ButtonHandler(DialogInterface dialog) {
        mDialog = new WeakReference<DialogInterface>(dialog);
    }

     @Override
     public void More ...handleMessage(Message msg) {
         switch (msg.what) {

            case DialogInterface.BUTTON_POSITIVE:
            case DialogInterface.BUTTON_NEGATIVE:
            case DialogInterface.BUTTON_NEUTRAL:
              ((DialogInterface.OnClickListener)msg.obj).onClick(mDialog.get(), msg.what);
               break;

             case MSG_DISMISS_DIALOG:
                 ((DialogInterface) msg.obj).dismiss();
         }
     }
 }

但是第150行是空行,如代码中的注释所示。 我真的卡在这里:(

0 个答案:

没有答案