android - 我得到了泄漏的窗口,最初添加在这里错误,请帮助..不知道该怎么办

时间:2011-12-21 05:50:55

标签: android

我得到这个错误。 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 ACTIVITY我有:

    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.java中设置了“newgame.gNewGameContext”(在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. 处理程序收到gameover消息。并实例化一个新的警告框

  3. 如果用户按下此警告框中的“否”按钮,则会显示“已泄露窗口” 最初在这里添加“错误!:(

  4. 请帮助,我不知道如何解决这个问题。 谢谢!

2 个答案:

答案 0 :(得分:2)

这可能是因为你试图在关闭对话框之前完成创建Dialog的活动。显然,因为你的对话框没有引用实际创建它的活动,这个问题出现了。考虑以处理方式更改代码。

答案 1 :(得分: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;
        }


    }  
};

..我添加了这行代码(清除Handler中的消息队列):
“this.removeMessages(newgame.STATE_GAMEOVER);”

不知道这是否是解决方案,但到目前为止一直有效 再次感谢你。

好的,我注意到的另一件事是:

我的手机上安装了一个应用程序,类似于TaskManager。有了这个应用程序,我可以看到我的应用程序多少内存用途,CPU等(监控应用程序)
但是当我退出我的游戏应用程序时,运行TaskManager我注意到了我的应用程序。仍在运行但处于“睡眠”模式。这通常是?

感谢。