1

我正在制作一个小游戏,其中我必须每秒检查一个值是否为零。当它为零时,游戏应该停止并显示一个对话框。从现在开始,在重新安装应用程序之前,游戏永远不会运行。

所以,我有一个带有 timertask 的计时器,它执行 runOnUiThread。

定时器:

private void update(){
    Timer timer = new Timer();
    timer.schedule(new TimerTask(){

        @Override
        public void run() {

            onChange();             
        }   

    },0,(1000* getResources().getInteger(R.integer.remove_speed_inSecond)));
}

runOnUiThread :(此时使用 try/catch 捕获异常,但我想修复而不是忽略它。)

private void onChange(){

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try{
                checkupifexpire();
            }
            catch (Exception ex) {
            }
        }
      });
}

我显示对话框的方法:

private void checkupifexpire() {
    if(eat == 0 || drink == 0 || wash == 0 || care == 0){
        dialog = new Dialog(this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
        dialog.setOnCancelListener(new DialogInterface.OnCancelListener()
        {
            @Override
            public void onCancel(DialogInterface dialog)
            {

                GameEngine.this.finish();
            }
        });
        dialog.setContentView(R.layout.activity_rip);
        dialog.show();
    }
}

总是当我按下后退按钮或只是主页按钮时应用程序崩溃。任何想法如何解决这个问题?

4

2 回答 2

3

所以,logcat 告诉我们,在 GameEngine.java 的第 306 行,在方法 checkupifexpire 中崩溃了,看起来就是该dialog.show()行。

我不是 100% 确定,但从你所说的来看,在我看来,当按下返回或主页时,应用程序将失去其 UI 线程。这意味着它checkuponexpire不能做它所做的事情。

为了解决您的崩溃问题,有三个明显的选择:

  1. 您可以onPause在您的主要活动中使用来捕捉应用程序何时失去屏幕。此时,您需要停止计时器,或者将其切换为使用 Toast 来传达信息。

  2. 仅在中使用 Toastcheckuponexpire

  3. 决定当按下返回键或主键时游戏结束并取消计时器。

要真正获得对话框,更改用于创建对话框的上下文也可能会有所帮助。尽管应该谨慎使用它,但它可能getApplicationContext()正是您需要的(可能this.getApplicationContext())。

于 2013-03-31T20:41:50.723 回答
0

感谢 Neil Townsend 和 WELLCZECH。:) 我的问题是生命周期。

大多数情况下,我让应用程序在 onCreat() 中运行并且没有 onStart() 方法。只是不知道这些方法和它们一样重要。

我也不需要显示对话框。相反,我只需要开始一项新活动并取消旧活动。

于 2013-04-01T15:34:16.227 回答