Android工作室:TimerTask

Android Studio: TimerTask

我正在创建一个简单的点击游戏,它会在屏幕上生成敌人,当用户点击它们时,他们会获得分数并消灭敌人。当用户点击它们时,我通过使图像框可见和不可见来做到这一点。它们 运行 在计时器上并且有一个持续的产卵循环。

目前我想实现一种让用户开始失去健康的方式。所以我想检查敌人的图像框是否可见,如果可见,玩家会慢慢失去生命值。

我对创建可以刷新此作业 ​​UI 的计时器任务感到困惑。如果某些图像可见或不可见,我希望能够不断检查 UI。我已经从我自己的研究中开始了这个,但是如果实现这个,游戏在加载时会崩溃。

要刷新的计时器 UI:

private Timer mTimer1;
private TimerTask mTt1;
private Handler mTimerHandler = new Handler();

  public void onStart() {
    mTimer1 = new Timer();
    mTt1 = new TimerTask() {
        public void run() {
            mTimerHandler.post(new Runnable() {
                public void run() {
                    //TODO
                    final TextView health = (TextView) findViewById(R.id.Health);
                    health.setText("Health:  " + health2);

                    //Enemy ImageViews
                    final ImageView enemy1 = (ImageView) findViewById(R.id.enemy1);
                    final ImageView enemy2 = (ImageView) findViewById(R.id.enemy2);
                    final ImageView enemy3 = (ImageView) findViewById(R.id.enemy3);
                    final ImageView enemy4 = (ImageView) findViewById(R.id.enemy4);

                    //sets imageViews into array
                    final ImageView[] enemies = new ImageView[4];
                    enemies[0] = enemy1;
                    enemies[1] = enemy2;
                    enemies[2] = enemy3;
                    enemies[3] = enemy4;

                    boolean running = true;
                    while (running) {
                        if (enemy1.getVisibility() == View.VISIBLE) {
                            int damage = 1;
                            health2 = health2 - damage;
                            health.setText("Health:" + health2);
                        } else {
                            // Either gone or invisible
                        }
                        if (enemy2.getVisibility() == View.VISIBLE) {
                            int damage = 1;
                            health2 = health2 - damage;
                            health.setText("Health:" + health2);
                        } else {
                            // Either gone or invisible
                        }
                        if (enemy3.getVisibility() == View.VISIBLE) {
                            int damage = 1;
                            health2 = health2 - damage;
                            health.setText("Health:" + health2);
                        } else {
                            // Either gone or invisible
                        }
                        if (enemy4.getVisibility() == View.VISIBLE) {
                            int damage = 1;
                            health2 = health2 - damage;
                            health.setText("Health:" + health2);
                        } else {
                            // Either gone or invisible
                        }

                    }
                }
            });
        }


    };
    mTimer1.schedule(mTt1, 1, 5000);
}

}

这是我创建的定时任务。我想弄清楚为什么这会导致我的游戏崩溃以及如何解决此问题。我以前从未以这种方式使用过计时器,所以如果问题很明显,这就是我没有注意到它的原因。

我在 onCreate 方法中有更多代码,如果需要,可以 post。感谢您为初学者提供的所有帮助和建议。

崩溃:

根据错误信息你需要调用super.onStart() 所以你需要在这里添加:

public void onStart() {

super.onStart();

//你的代码

}

我假设你知道,但以防万一 super 是 class 你扩展了父级。如果您覆盖它的 onStart 函数,则正常的 onStart 过程不会完成,如果您不调用超级函数。

编辑:至于你的其他问题,我(作为 java 的初学者,所以我并不是说这是最好的方法)会考虑做类似的事情:

首先创建一个处理程序并为敌人制作可运行程序:

Handler handler = new Handler();
Runnable[] eRunnables = new Runnable[enemies.length-1];

for(int i = 0; i < eRunnables.length; i++){
   eRunnables[i] = new Runnable(){
        public void run(){
            if(enemies[i].getVisibility() == View.VISIBLE){
                health2--;
                health.setText("Health:" + health2);
                handler.postDelayed(eRunnables[i], 1000);
            }    
        }
    };
}

然后在你最初让敌人可见的地方(除了将它们设置为可见之外)做一些类似

的事情

handler.postDelayed(eRunnable[enemyNr], 1000);

当然可以用您想要的毫秒数替换 1000。

再说一次,我并不是说这是最好的方法,只是我想出来的。