如何在基于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
。所以我需要将活动实例一直传递给这个类?是的。您的活动
是上下文
的一个实例,并绑定到窗口
。您创建的任何对话框都将被删除