我正在构建一个包含GLSurfaceView
的游戏。此GLSurfaceView
会收到所有触摸事件,并根据该游戏进行。现在基于某些条件我想显示某些对话框。说游戏以双击结束,我想显示一个对话框,说明用户是否想要重新启动。但我想这些事件不会在UI线程中处理,因此当我尝试创建对话框时,我的应用程序崩溃了。我怎样才能做到这一点?
创建此对话框的代码:
Context ctx = MainActivity.getContext();
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
builder.setTitle(ctx.getResources().getString(R.string.ThemeSelectionDialogTitle));
builder.setCancelable(true);
final CharSequence[] items={"Theme 1", "Theme 2"};
builder.setSingleChoiceItems(items,-1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which)
{
if("Theme 1".equals(items[which]))
{
Log.i(LOGUtil.LOG_TAG, "Theme 1 Selected");
}
else if("Theme 2".equals(items[which]))
{
Log.i(LOGUtil.LOG_TAG, "Theme 2 Selected");
}
dialog.dismiss();
}
});
//now that the dialog is set up, it's time to show it
AlertDialog alertDialog = builder.create();
alertDialog.show();
CallStack:
DalvikVM [localhost:8600]线程[< 1>主要](暂停(例外 WindowManager $ BadTokenException))
ViewRootImpl.deliverInputEvent(ViewRootImpl $ QueuedInputEvent)行: 5662 ViewRootImpl.doProcessInputEvents()行:5588
ViewRootImpl.enqueueInputEvent(InputEvent,InputEventReceiver,int, boolean)line:5559
ViewRootImpl $ WindowInputEventReceiver.onInputEvent(InputEvent)行: 5737
ViewRootImpl $ WindowInputEventReceiver(InputEventReceiver).dispatchInputEvent(INT, InputEvent)行:185 MessageQueue.nativePollOnce(int,int)行: 不可用[native method] MessageQueue.next()line:138
Looper.loop()行:123 ActivityThread.main(String [])行:5086
Method.invokeNative(Object,Object [],Class,Class [],Class,int, boolean)line:not available [native method] Method.invoke(Object, 对象...)行:515 ZygoteInit $ MethodAndArgsCaller.run()行: 785 ZygoteInit.main(String [])行:601 NativeStart.main(String [])行:不可用[native method]
线程[< 10> Binder_2](正在运行)线程[< 9> Binder_1](正在运行) 线程[< 11> GLThread 4824](运行)线程[< 12> Binder_3] (运行)
相关的Logcat输出:
D / SomeSDK(3817):游戏抽奖!!! D / WifiStateMachine(1068): handleMessage:E msg.what = 151572 D / WifiStateMachine(1068): processMsg:ConnectedState D / WifiStateMachine(1068):processMsg: L2ConnectedState W / HandlerScheduledExecuto(27831):任务没有 实现UiTask。考虑使用NamedUiRunnable Consumers.consumeAsync W / HandlerScheduledExecuto(27831):任务没有 实现UiTask。考虑使用NamedUiRunnable Consumers.consumeAsync W / HandlerScheduledExecuto(27831):任务没有 实现UiTask。考虑使用NamedUiRunnable for eky @ 4210c078 ... ...D / WifiStateMachine(1068):handleMessage:X W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for eky @ 4210c078 ...... W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for Consumers.consumeAsync W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for Consumers.consumeAsync W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 42103ca8 ...... W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for Consumers.consumeAsync D / dalvikvm(27831):GC_CONCURRENT释放2085K,39%免费10594K / 17184K, 暂停2ms + 2ms,总计26ms D / dalvikvm(27831):WAIT_FOR_CONCURRENT_GC 阻塞18ms D / dalvikvm(27831):WAIT_FOR_CONCURRENT_GC阻塞18ms D / dalvikvm(27831):WAIT_FOR_CONCURRENT_GC阻止了19ms D / dalvikvm(27831):WAIT_FOR_CONCURRENT_GC阻止了19ms W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for Consumers.consumeAsync W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 420abc18 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 420a7a80 ......
W / HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NamedUiRunnable for eky @ 4233f958 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for Consumers.consumeAsync ...... W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for eky @ 421b6100 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 420abc18 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 420a7a80 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑使用NamedUiRunnable for eky @ 42099068 W / HandlerScheduledExecuto(27831):任务没有实现UiTask。 考虑将NamedUiRunnable用于eky @ 42096ed8 W
答案 0 :(得分:2)
使用Activity
实例作为上下文而不是静态上下文,如该应用程序上下文。该对话框绑定到Activity
的生命周期,因此它需要实例而不是静态而不再有效。