关闭应用程序后,通过在计时器中显示Dialog(在runOnUiThread中)崩溃应用程序。

时间:2013-03-31 20:17:37

标签: java android timer dialog

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

所以,我有一个带有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来捕获exeption,但我想修复而不是忽略它。)

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();
    }
}

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

2 个答案:

答案 0 :(得分:3)

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

我不是百分百肯定,但是根据你的说法,在我看来,当按下后退或回家时,应用程序将失去其UI线程。这意味着checkuponexpire无法完成它的工作。

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

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

  2. 仅在checkuponexpire

  3. 中使用Toast
  4. 决定当按下后门或主场时,游戏仍然结束并取消定时器。

  5. 要实际获取对话框,更改用于创建对话框的上下文可能也会有所帮助。虽然应该谨慎使用,但getApplicationContext()可能就是你需要的(可能是this.getApplicationContext())。

答案 1 :(得分:0)

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

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

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