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

时间:2014-08-30 09:43:32

标签: android android-ui glsurfaceview

我正在构建一个包含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

1 个答案:

答案 0 :(得分:2)

使用Activity实例作为上下文而不是静态上下文,如该应用程序上下文。该对话框绑定到Activity的生命周期,因此它需要实例而不是静态而不再有效。