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行是空行,如代码中的注释所示。 我真的卡在这里:(