Android - я получаю утек окно, которое было первоначально добавлено здесь ошибка, пожалуйста, помогите .. не знаю, что делать

1

Я получаю это заблуждение. msg: "имеет просочившееся окно, которое было первоначально добавлено здесь". У меня есть этот код:

ball.java:

    ...


  if(current_ball.physx.position.distance2(renderer.gPlayer.physx.position) <= (graphics.SQUARE_SIZE-4)*2)

            {
                if(renderer.gSnd_GameOver!=0 && renderer.bUseSound) renderer.gSndPool.play(renderer.gSnd_GameOver, 1, 1, 0, 0, 1);
                renderer.bIsGameOver = true;

                Message msg = new Message();
                msg.what = newgame.STATE_GAMEOVER;
                newgame.handler.sendMessage(msg);
                return;
            }

следующий, в newgame.java ДЕЯТЕЛЬНОСТЬ У меня:

    static DialogInterface.OnClickListener dialogClickListener = new  
    DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which)
    {
        Intent intent = null;

        switch (which){
        case DialogInterface.BUTTON_POSITIVE:

            dialog.dismiss();
            ((Activity) newgame.gNewGameContext).finish();
            intent = new Intent ( newgame.gNewGameContext , newgame.class );
            newgame.gNewGameContext.startActivity( intent );
            Log.d("redwing", "YES button ... successfuly processed, new intent starded.");

            break;

        case DialogInterface.BUTTON_NEGATIVE:


            dialog.dismiss();
            ((Activity) newgame.gNewGameContext).finish();
            Log.d("redwing", "NO button ... successfuly processed, current intent was closed.");
            break;
        }
    }        

и этот HANDLER, который получает сообщения, когда GameOver (сообщение генерируется в ball.java, как указано в предыдущем коде)... и создает новый диалог оповещений с этим вопросом "PlayAgain?". (обратите внимание, что этот HANDLER существует и создан в newgame.java):

    public static Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);


        switch(msg.what)
        {
            case newgame.STATE_GAMEOVER:

                AlertDialog.Builder builder = new AlertDialog.Builder(newgame.gNewGameContext);
                builder.setCancelable(false);
                builder.setTitle("GaMeOvEr");
                builder.setIcon(R.drawable.ic_launcher);
                builder.setMessage("Play again ?").setPositiveButton("Yes", dialogClickListener)
                                                    .setNegativeButton("No" , dialogClickListener).show();
             break;
        }

    }  
};

... также "newgame.gNewGameContext" устанавливается следующим образом в newgame.java(in onCreate):

    @Override
protected void onCreate(Bundle newgameInstance) {
    // TODO Auto-generated method stub
    super.onCreate(newgameInstance);


    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN );
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    gNewGameContext = this;
    ......        

Чтобы проверить, я делаю это:

  1. когда gameover = true, я отправляю сообщение обработчику.

  2. обработчик получает сообщение об ошибке. и создает новый флажок оповещения

  3. если пользователь нажимает кнопку "Нет" в этом окне предупреждения, я получаю "просочившееся окно, которое
    был первоначально добавлен здесь "Ошибка! :(

Пожалуйста, помогите, я не знаю, как это исправить. Спасибо !

Теги:

2 ответа

2

Основная причина этого может заключаться в том, что вы пытаетесь завершить работу, в которой вы создали Dialog, даже до закрытия диалога. Очевидно, так как ваш диалог не будет ссылаться на действительность, которая фактически создала его, возникает эта проблема. Рассмотрите возможность изменения кода таким образом, чтобы он обрабатывался.

  • 0
    Спасибо за ответ. Как вы можете видеть в моем коде, я делаю: "dialog.dismiss (); ((Activity) newgame.gNewGameContext) .finish ();" Поэтому я отклоняю Alert Before shutdown Activity. Где я могу пойти не так?
  • 0
    Пожалуйста, помогите мне, любые идеи? Я застрял с этим больше недели ... :(
Показать ещё 2 комментария
0

Хм... Кажется, сейчас это работает, по крайней мере, до сих пор.

Я только что сделал несколько прогонов (10-20 запусков) приложения. и результаты хороши (т.е. без сбоев)

Я очистил сообщения в очереди в обработчике, когда GameOver = true, вот код с изменениями (возможно, это поможет другим):

    public static Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);


        switch(msg.what)
        {
            case newgame.STATE_GAMEOVER:

                AlertDialog.Builder builder = new AlertDialog.Builder(newgame.gNewGameContext);
                builder.setCancelable(false);
                builder.setTitle("GaMeOvEr");
                builder.setIcon(R.drawable.ic_launcher);
                builder.setMessage("Play again ?").setPositiveButton("Yes", dialogClickListener)
                                                    .setNegativeButton("No" , dialogClickListener).show();
                this.removeMessages(newgame.STATE_GAMEOVER);
             break;
        }


    }  
};

.. Я добавил эту строку кода (очистить очередь сообщений в обработчике):
"this.removeMessages(newgame.STATE_GAMEOVER);"

Не знаю, является ли это решением, но он работает до сих пор.
Еще раз спасибо.

Хорошо, еще одна вещь, которую я заметил, это:

У меня есть приложение, установленное на моем телефоне, что-то вроде TaskManager. С помощью этого приложения я могу видеть, сколько памяти мое приложение. использует, CPU и т.д. (приложения для мониторинга)
Но когда я выхожу из своего игрового приложения и запускаю TaskManager, я заметил, что мое приложение. все еще работает, но в режиме "сна". Это нормально?

Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню