Как показать диалог из статического метода

В моей игре, которая делается как для Android, так и для IOS с использованием cocos2dx, я должен показывать видео (для Android). Я планирую показать это в диалоговом окне (поверх игрового вида). Проблема в том, что у меня нет ссылки на действие для отображения диалога (поскольку диалоги могут отображаться только в действиях). Несмотря на то, что в папке cocos2dx lib есть Cocos2dxActivity, но я не понимаю, как его использовать. Из кода С++ я вызываю статический метод из класса Java, как показано ниже.

void LMJNICommunicator::showVideo()
{
     LOGD("initialiseDatabase inside LMJNICommunicator");

     jmethodID methodID = 0;
     JNIEnv *pEnv = 0;
     pEnv = getJNIEnv();
     jclass ret = pEnv->FindClass("com/mobinius/lostmonstersclass/LMDatabaseDataManager");
     methodID = pEnv->GetStaticMethodID(ret, "showVideo", "()V");

     if (! methodID)
     {
          LOGD("Failed to find static method id of %s", "showVideo");
          return;
     }

     pEnv->CallStaticVoidMethod(ret,methodID);
     pEnv->DeleteLocalRef(ret);

}

Статический метод (который находится в обычном классе Java), который я вызываю из кода C++

Class LMDatabaseDataManager {

    public static void showVideo() {

         Dialog dialog = new Dialog(Cocos2dxActivity.getInstance());
         dialog.show();
        // getting Can't create handler inside thread that has not called Looper.prepare() error
    }
}

Я пытался использовать Handler, например этот но не получил результата (такая же ошибка в этом посте). Также попытался получить статический Context, например это.

Итак, мой путь правильный? Если не прав, предложите способ, как я могу реализовать то же самое. Спасибо.

Изменить:

Наконец-то получил ответ на это. Ранее я пытался работать в потоке пользовательского интерфейса со статическим контекстом приложения, как в этом ссылку, но не получил... с экземпляром активности Cocos2dxActivity я его получил.

Class LMDatabaseDataManager {

    public static void showVideo() {        

    Cocos2dxActivity.getInstance().runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Dialog dialog = new Dialog(Cocos2dxActivity.getInstance());
            dialog.show();            
        }
    });

    }
}

person Braj    schedule 14.11.2012    source источник
comment
Вы не накладываете свое видео на действие?   -  person ajacian81    schedule 15.11.2012
comment
на самом деле нет... как я объяснил в вопросе, это действие с именем Cocos2dxActivity, в котором запущены GLSurfaceView n... Я не знаю, могу ли я его использовать или нет   -  person Braj    schedule 15.11.2012


Ответы (1)


Попробуйте добавить соответствующие строки в Cocos2dxActivity:

public class Cocos2dxActivity extends Activity {
    private static Cocos2dxActivity instance = null;
   @Override public void onCreate(Bundle b) {
     ...
     this.instance = this;
     }

     public static Cocos2dxActivity getInstance() {
        return instance;
     }



}

Когда вы хотите создать свой диалог:

if (Cocos2dxActivity.getInstance() != null)  {
    AlertDialog dialog = new AlertDialog(Cocos2dxActivity.getInstance());
    // rest of your dialog code goes here
}
person ajacian81    schedule 15.11.2012
comment
спасибо за ответ ... как только я попытался выше, получив глобальный контекст приложения, как показано во второй ссылке моего вопроса, но не получил результата ... в любом случае, я попробую ваш ответ и дайте вам знать - person Braj; 15.11.2012
comment
Я попробовал ваш ответ... его ошибка выдачи не может создать обработчик внутри потока, который не вызвал Looper.prepare() - person Braj; 16.11.2012
comment
Большое спасибо за ваше время ... Я решил проблему. Ранее я пытался работать в потоке пользовательского интерфейса со статическим контекстом приложения, как во второй ссылке, но не получил... с экземпляром активности Cocos2dActivity, я получил его... - person Braj; 16.11.2012
comment
Я думаю, что this.instance = null; следует вызывать из метода onDestroy(). В противном случае произойдет утечка памяти после того, как действие будет мертво, поскольку ссылка на мертвое действие будет сохранена. Дополнительная информация: ссылка - person ra3o.ra3; 21.03.2016