Java 关闭应用程序后,在计时器(runOnUiThread)中显示对话框,从而导致应用程序崩溃。

Java 关闭应用程序后,在计时器(runOnUiThread)中显示对话框,从而导致应用程序崩溃。,java,android,timer,dialog,Java,Android,Timer,Dialog,我正在做一个小游戏,在里面我必须每秒检查一个值是否为零。当它为零时,游戏应该停止并显示一个对话框。 从现在起,在重新安装应用程序之前,游戏永远不会运行 因此,我有一个带有timertask的计时器,它执行runOnUiThread 计时器: private void update(){ Timer timer = new Timer(); timer.schedule(new TimerTask(){ @Override public void

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

因此,我有一个带有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 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();
    }
}
总是当我按下后退按钮或仅按下主页按钮时,应用程序就会崩溃。
知道如何解决这个问题吗?

因此,logcat告诉我们,在方法checkupifexpire中,在GameEngine.java的第306行,is崩溃了,它看起来像是
对话框.show()

我不是100%确定,但从你所说的,在我看来,当按下back或home时,应用程序将丢失其UI线程。这意味着
checkuponexpire
无法完成它所做的事情

要解决碰撞问题,有三个明显的选项:

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

  • 仅在
    checkuponexpire

  • 确定当按下back或home键时游戏结束,并取消计时器


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

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

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


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

    你能在fail上发布stacktrace吗?更多的信息会很有帮助-当它崩溃时抛出的异常是什么?logcat中的异常非常大。。。这里是它的大部分:@besnep OK。似乎在活动完全启动之前调用了
    checkupifexpire
    方法。我想在296行的
    访问方法中。这就抛出了这个例外。这是因为你没有自己的应用程序窗口,也没有怎么说。只需在应用程序出现在屏幕上之前显示对话框即可。你明白我的意思吗?试着检查一下。@besnep在logcat输出中,您可以在初始化操作栏后从顶部的第13行看到系统调用onChange方法。然后在UI线程上调用一些东西(我认为这是一些可运行的实例),然后调用access方法,这个方法调用check…方法where is Dialog.show()。调用onCreate后立即调用所有heapends,以便在创建或旋转应用程序后立即调用,但不会“显示”它。Thx。1.努力避免被免除。但是长猫它还是扔一样的。。。。哦,你做了什么?换成烤面包还是停止计时器?我没有停止计时器。。。所以今年我停止了计时器。年,似乎。。应用程序停止崩溃,但longcat仍会抛出错误。Thx致Neil Townsend和WELLCZECH!:)但我只是觉得很复杂…因为当我想展示这个对话时,主应用程序不再使用了,那么我为什么要启动一个对话框呢^^我现在的解决方案是,我刚开始一个新的活动并取消了主活动。嗨,贝斯内普-在StackOverflow上,通常认为给你要感谢的人打勾是一个很好的协议,而不是把你的感谢写在你自己的答案中:-)哦,对不起,我想在我的问题的解决方案是^^的地方打勾,所以你的答案不是解决方案,它只是有助于得到解决方案。最后Well捷克人发现我从来没有写过onStart()方法,这意味着我必须给他打勾。但他从未写过答案。我真的很想给你一个“有用”的回答(我试过了,希望将来能做到),但是a的声誉分数不到15分:(很公平,这是有道理的!
    
    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();
        }
    }