我正在做一个小游戏,我必须每秒检查一个值是否为零。当它为零时,游戏应停止并显示对话框。 从现在开始,在重新安装应用程序之前,游戏永远都不会工作。
所以,我有一个带有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();
}
}
总是当我按下后退按钮或只是主页按钮时,应用程序崩溃了。 任何想法如何解决这个问题?
答案 0 :(得分:3)
所以,logcat告诉我们在GameEngine.java的306行崩溃,方法checkupifexpire,看起来像是dialog.show()
行。
我不是百分百肯定,但是根据你的说法,在我看来,当按下后退或回家时,应用程序将失去其UI线程。这意味着checkuponexpire
无法完成它的工作。
要解决崩溃问题,有三个明显的选择:
您可以在主活动中使用onPause
来捕捉应用程序丢失屏幕的时间。此时,您需要停止计时器,或者将其切换为使用Toast来传达信息。
仅在checkuponexpire
决定当按下后门或主场时,游戏仍然结束并取消定时器。
要实际获取对话框,更改用于创建对话框的上下文可能也会有所帮助。虽然应该谨慎使用,但getApplicationContext()
可能就是你需要的(可能是this.getApplicationContext()
)。
答案 1 :(得分:0)
感谢Neil Townsend和WELLCZECH。 :) 我的问题是生命周期。
大多数情况下,我让应用程序在onCreat()中运行,并且没有onStart()方法。 只是不知道这些方法和它们一样重要。
此外,我不需要显示对话框。相反,我只需要开始一项新活动并取消旧活动。