Android Studio: TimerTask

Я создаю простую клик-игру, которая порождает врагов на экране, и когда пользователь нажимает на них, они получают очки, а враги уничтожаются. Я делаю это, делая окна изображений видимыми и невидимыми, когда пользователь нажимает на них. Они работают по таймеру и имеют постоянный цикл нереста.

В настоящее время я хочу реализовать способ, которым пользователь начнет терять здоровье. Поэтому я хотел бы проверить, виден ли блок изображений врага, если он есть, игрок будет медленно терять здоровье.

Меня смущает создание задачи таймера, которая может обновлять пользовательский интерфейс для этой работы. Я хочу иметь возможность постоянно проверять пользовательский интерфейс, видны ли какие-то изображения или нет. Я начал это из своего собственного исследования, но игра вылетает при загрузке, если это реализовано.

Таймер обновления пользовательского интерфейса:

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, и я могу опубликовать его при необходимости. Спасибо за помощь и советы этому новичку.

Крушение:

введите здесь описание изображения


person George Brooks    schedule 01.04.2017    source источник
comment
Опубликуйте журнал сбоев   -  person Aditya Desai    schedule 01.04.2017


Ответы (1)


Основываясь на сообщении об ошибке, вам нужно вызвать super.onStart (), поэтому вам нужно добавить это здесь:

public void onStart () {

super.onStart ();

//ваш код

}

Я предполагаю, что вы знаете, но на всякий случай super - это класс, который вы расширяете, родительский. если вы переопределите его функцию 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 [вражеский номер], 1000);

разумеется, замените 1000 на сколько угодно миллисекунд.

Опять же, я не говорю, что это лучший способ, просто то, что я придумал.

person Henk    schedule 01.04.2017
comment
Спасибо, моя ошибка позволила вызвать onStart, но возникла новая проблема с оператором while. Мой игровой экран не загружается, и экран остается черным, сбоев нет, есть идеи, почему? - person George Brooks; 01.04.2017
comment
@GeorgeBrooks Я сам новичок в java, но я не думаю, что бесконечный цикл while, подобный этому, был бы хорош, он продолжает работать 100% времени, в этом цикле нет никаких разрывов или ничего ... в чем смысл вашего timertask, есть ли там что-то бесконечное? - person Henk; 01.04.2017
comment
Мне нужно, чтобы он был бесконечным, чтобы постоянно проверять пользовательский интерфейс на предмет изменений? это была моя первоначальная идея. Могу ошибаться, что это нужно делать именно так. - person George Brooks; 01.04.2017
comment
Кажется, это отличное решение, я постараюсь реализовать его и вернусь к вам. спасибо за помощь - person George Brooks; 01.04.2017
comment
это не работает, хотя с точки зрения передачи i в исполняемую функцию вам, возможно, придется создать класс, который реализует runnable, как принятый здесь ответ: stackoverflow.com/questions/9123272/ - person Henk; 01.04.2017