如何在基于GLSurfaceView的Android游戏中显示UI?

如何在基于GLSurfaceView的Android游戏中显示UI?,android,android-ui,glsurfaceview,Android,Android Ui,Glsurfaceview,我正在构建一个包含GLSurfaceView的游戏。此GLSurfaceView接收所有触摸事件并基于该游戏进行。现在基于某些条件,我想显示某些对话框。假设游戏在双击后结束,我想显示一个对话框,说明用户是否想重新启动。但我猜这些事件并没有在UI线程中处理,所以当我试图创建对话框时,我的应用程序崩溃了。我怎样才能做到这一点 创建此对话框的代码: Context ctx = MainActivity.getContext(); AlertDialog.Builder builder = new

我正在构建一个包含
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();
调用堆栈:

DalvikVM[localhost:8600]线程[main](挂起(异常 WindowManager$BadTokenException))
ViewRootImpl.deliverInputEvent(ViewRootImpl$QueuedInputEvent)行: 5662 ViewRootImpl.doProcessInputEvents()行:5588
ViewRootImpl.enqueueInputEvent(InputEvent,InputEventReceiver,int, 布尔值)行:5559
ViewRootImpl$WindowInputEventReceiver.onInputEvent(InputEvent)行: 5737
ViewRootImpl$WindowInputEventReceiver(InputEventReceiver)。dispatchInputEvent(int, InputEvent)行:185 MessageQueue.nativePollOnce(int,int)行: 不可用[本机方法]MessageQueue.next()行:138
Looper.loop()行:123 ActivityThread.main(字符串[])行:5086
invokenactive(对象,对象[],类,类[],类,int, 布尔值)行:不可用的[native method]方法。调用(对象, 对象…)行:515 ZygoteInit$MethodAndArgsCaller.run()行: 785接合面。主(字符串[])线:601 NativeStart.main(字符串[])行:不可用[本机方法]
螺纹[Binder_2](运行)螺纹[Binder_1](运行) 螺纹[GLThread 4824](运行)螺纹[Binder_3] (正在运行)

相关Logcat输出:

D/SomeSDK(3817):游戏抽签!!!D/wifistate机器(1068): handleMessage:E msg.what=151572 D/WifiStateMachine(1068): processMsg:ConnectedState D/WifiStateMachine(1068):processMsg: L2ConnectedState W/HandlerScheduledExecuto(27831):任务不存在 实现UiTask。考虑使用NoDeUnRunnabl Consumers.ConsumerAsync W/HandlerScheduledExecuto(27831):任务不存在 实现UiTask。考虑使用NoDeUnRunnabl Consumers.ConsumerAsync W/HandlerScheduledExecuto(27831):任务不存在 实现UiTask。考虑使用NoDeUnRunnableky@4210c078 ...

D/WifiStateMachine(1068):handleMessage:X W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@4210c078 ... ... W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑对消费者使用No.DeNuuRunnabl。 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑对消费者使用No.DeNuuRunnabl。 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@42103ca8 ... ... W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑对消费者使用No.DeNuuRunnabl。 D/dalvikvm(27831):GC_并发释放2085K,39%释放10594K/17184K, 暂停2ms+2ms,总计26ms D/dalvikvm(27831):等待并发GC 阻塞的18ms D/dalvikvm(27831):等待并发\u GC阻塞的18ms D/dalvikvm(27831):等待并发GC阻塞19ms D/dalvikvm(27831):等待并发GC阻塞19ms W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑对消费者使用No.DeNuuRunnabl。 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@420abc18 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@420a7a80... ...

W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@4233f958 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑为消费者使用名称。 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@421b6100 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@420abc18 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@420a7a80 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@42099068 W/HandlerScheduledExecuto(27831):任务未实现UiTask。 考虑使用NoDeUnRunnableky@42096ed8W


使用
活动
实例作为上下文,而不是像应用程序上下文那样的静态上下文。对话框绑定到您的
活动的生命周期
,因此它需要的是实例,而不是可能不再有效的静态文件。

用整个堆栈返回日志。“所有用户触摸事件都在您的ui线程上传递,因此还发生了其他事情。@LarrySchiefer添加了调用堆栈和代码段。Logcat没有提供任何有用的信息。您可以在创建对话框的位置添加代码吗?
ctx
从哪里来?@LarrySchiefer添加了代码
ctx
来自
MainActivity
中的静态变量<代码>主要活动包含
GLSurfaceView
ok!我不完全明白。现在我正在使用存储在该静态变量中的应用程序上下文。你的意思是,这甚至可能是无效的
main活动
包含
GLSurfaceView
和需要显示此警报的
GameController
。所以我需要将活动实例一直传递给这个类?是的。您的
活动
上下文
的一个实例,并绑定到
窗口
。您创建的任何对话框都将被删除