2014-08-30 4 views
0

Я создаю игру, которая содержит GLSurfaceView. Этот GLSurfaceView получает все события касания и на основе этой игры продолжается. Теперь, основываясь на определенных условиях, я хочу показать определенное диалоговое окно. Говорить, что игра заканчивается двойным нажатием, я хочу показать диалоговое окно, в котором говорится, если пользователь хочет перезапустить. Но я думаю, что эти события не обрабатываются в потоке пользовательского интерфейса, поэтому, когда я пытаюсь создать диалоговое окно, мое приложение рушится. Как я могу это достичь?Как показать интерфейс в игре GLSurfaceView на базе Android?

код, который создает этот диалог:

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 [локальный: 8600] Автор [< 1> Основной] (Приостановлено (исключение 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 (интермедиат, InputEvent): 185 MessageQueue.nativePollOnce (INT, INT) строка: не доступен [нативный метод] MessageQueue.next() строка: 138
Looper.loop() строка: 123 ActivityThread.main (String []) линия: 5086
метод. invokeNative (Object, Object [], Class, Class [], Class, int, boolean) строка: недоступна [native method] Method.invoke (Object,)Object ...) строка: 515 ZygoteInit $ MethodAndArgsCaller.run) линия (: 785 ZygoteInit.main (String []) строка: 601 NativeStart.main (String []) линия: нет в наличии [нативный метод]
тема [< 10> Binder_2] (Запуск) резьба [< 9> Binder_1] (Запуск) резьбы [< 11> GLThread 4824] (Запуск) резьба [< 12> Binder_3] (Запуск)

Соответствующей Logcat Выход:

D/SomeSDK (3817): Игра-ничья !!! Д/WifiStateMachine (1068): handleMessage: Е = msg.what Д сто пятьдесят одна тысяча пятьсот семьдесят два/WifiStateMachine (1068): processMsg: ConnectedState Д/WifiStateMachine (1068): processMsg: L2ConnectedState Вт/HandlerScheduledExecuto (27831): задача не осуществить UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync W/HandlerScheduledExecuto (27831): Задача не реализовать UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync W/HandlerScheduledExecuto (27831): Задача не реализовать UiTask. Рассмотрите возможность использования NamedUiRunnable для Eky @ 4210c078 ... ...

D/WifiStateMachine (1068): handleMessage: X W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 4210c078 ... ... W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 42103ca8 ... ... W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync D/dalvikvm (27831): GC_CONCURRENT освободил 2085K, 39% бесплатно 10594K/17184K, остановился 2ms + 2ms, всего 26ms D/dalvikvm (27831): WAIT_FOR_CONCURRENT_GC заблокирован 18мс D/dalvikvm (27831): WAIT_FOR_CONCURRENT_GC заблокирован 18мс D/dalvikvm (27831): WAIT_FOR_CONCURRENT_GC заблокирован 19ms D/dalvikvm (27831): WAIT_FOR_CONCURRENT_GC заблокирован 19ms W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 420abc18 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 420a7a80 ... ...

W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 4233f958 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Consumers.consumeAsync ... ... W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 421b6100 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 420abc18 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 420a7a80 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для eky @ 42099068 W/HandlerScheduledExecuto (27831): Задача не реализует UiTask. Рассмотрите возможность использования NamedUiRunnable для Eky @ 42096ed8 W

+0

Опубликуйте свой логарифм со всем обратным счетчиком стека. Все пользовательские события касания доставляются на вашу нить ui, поэтому происходит что-то еще. –

+0

@LarrySchiefer Добавлен фрагмент кода CallStack и кода. Logcat не дает никакой полезной информации –

+0

Можете ли вы добавить код вокруг того, где вы создаете диалог? Откуда взялся «ctx»? –

ответ

2

Используйте экземпляр Activity в качестве контекста, а не статический контекста, как этот контекст приложения. Диалог связан с жизненным циклом вашего Activity, поэтому ему нужен экземпляр, а не статический, который может быть более недействительным.

+0

ok! Я не понимаю это полностью. Прямо сейчас я использую контекст приложения, который хранится в этой статической переменной. Вы говорите, что это может быть даже недействительным. 'MainActivity' содержит' GLSurfaceView' и содержит 'GameController', который должен показывать это предупреждение. Итак, мне нужно передать этот экземпляр активности до этого класса? –

+0

Да. Ваша 'Activity' является экземпляром' Context' и привязана к 'Window'. Любое созданное вами диалоговое окно будет привязано к «Деятельности», которая является временной. Контекст вашего приложения является синглом для вашего процесса приложения и не имеет связанного с ним окна. –