CountdownTimer не работает в Runnable - PullRequest
0 голосов
/ 03 июня 2018

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

Дело в том, что я пытаюсь разработать что-то вроде игры и пытаюсь добавить компьютерного или AI-игрока против человека-игрока.

Для этого я добавил метод CountdownTimer in OnCreate, и он работал нормально только один раз, поскольку OnCreate выполняется только один раз.Но когда я попытался добавить цикл while внутри выполняемого и внутри этого цикла while, я добавил тот же CountdownTimer, но он начал давать мне ошибки.

if(player2_name.equals("Computer")) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                while (player2_name.equals("Computer")) {
                  CountDownTimer computer_player;
                   ct = 5;
                   firstplayer_game_button.setClickable(false);
                   computer_player = new CountDownTimer(5000, 1000) {
                       @Override
                       public void onTick(long millisUntilFinished) {
                           ct = ct - 1;
                    //       timer_counter.setText("" + ct);
                           if (ct == 1) {
                               firstplayer_game_button.setClickable(true);
                           }
                       }

                       @Override
                       public void onFinish() {
                        //   secondplayer_game_button.setBackgroundResource(R.drawable.button_player_2);
                        //   firstplayer_game_button.setBackgroundResource(R.drawable.button_player_1);
                        //   firstplayer_game_button.setClickable(true);
                           if (player2_name.equals("Computer")) {

                               secondplayer_game_button.setClickable(false);

                           } else {
                               secondplayer_game_button.setClickable(true);
                           }
                           if (checker != 1) {
                               Click_Condition_checker(2);
                           }
                       }
                   };
                   computer_player.start();
                }
            }
        };
        Thread mythread = new Thread(r);
        mythread.start();

Я знаю, что Runnable не может взаимодействовать с пользовательским интерфейсом напрямую и длячто нам нужны обработчики, поэтому я прокомментировал все интерфейсы пользовательского интерфейса.Но все равно не повезло.И, к сожалению, я не могу определить ошибки.Если кто-то может помочь, то был бы очень любезен для такого глупого разработчика, как я.

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Во-первых, вам не нужно использовать Runnable, чтобы заставить CountDownTimer работать.Это потому, что CountDownTimer может напрямую взаимодействовать с пользовательским интерфейсом, если код, выполняющийся внутри Activity.

Во-вторых, вы не должны использовать цикл while внутри своего кода.Специально для следующего кода:

while (player2_name.equals("Computer")) {
   CountDownTimer computer_player;
   ...
   computer_player = new CountDownTimer(5000, 1000) {}
   ...
}

, что означает, что вы создаете новый объект, пока не исчерпаете всю память устройства или пока имя игрока2_ не будет "Computer".

Вы должны использовать логическое значениевместо этого флаг.

Я думаю, что вам нужно достичь, перезапустив CountDownTimer примерно так:

// use a more readable variable name instead of computer_player
final CountDownTimer cdtPlayer = new CountDownTimer(5000, 1000) {
   @Override
   public void onTick(long millisUntilFinished) {
     // do something
   }

   @Override
   public void onFinish() {
     // do something

     // restart to do all again
     cdtPlayer.start();
   }
};

cdtPlayer.start();

По поводу вашего следующего утверждения:

Если кто-то может помочь, то было бы очень любезно для глупого разработчика, такого как я.

Все глупы, когда начинают чему-то учиться.Не будь слишком строг с собой;)

0 голосов
/ 03 июня 2018

Не уверен насчет вашей цели, но ваш цикл while кажется проблематичным.Пока мы тестируем строку и не меняем ее значение, она будет бегать снова и снова (и к тому времени создать столько CountdownTimer, которое, как я думаю, не было вашим намерением)

...