2016-04-20 4 views
0

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

Вот мой код:

if (v == btnStart) { 
      Toast.makeText(ScoreBoardActivity.this, "The game has started. ENJOY!", Toast.LENGTH_LONG).show(); 
      btnStart.setText("STOP GAME"); 
      int playTime = (getIntent().getExtras().getInt("gameTime"))/10; 
      Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        public void run() { 
         int playTime = (getIntent().getExtras().getInt("gameTime"))/10; 
         if (sec1 < 9) { 
          sec1 = sec1 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 < 5) { 
          sec1 = 0; 
          sec10 = sec10 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 == 5 && min1 < 9) { 
          sec1 = 0; 
          sec10 = 0; 
          min1 = min1 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } else if (sec1 == 9 && sec10 == 5 && min1 == 9 && min10 < playTime) { 
          sec1 = 0; 
          sec10 = 0; 
          min1 = 0; 
          min10 = min10 + 1; 
          tvSec1.setText(String.valueOf(sec1)); 
          tvSec10.setText(String.valueOf(sec10)); 
          tvMin10.setText(String.valueOf(min10)); 
          tvMin1.setText(String.valueOf(min1)); 
         } 
        } 
       }, 1000); 
      } 
+0

Показать об ошибке. Вы уверены, что у вас есть аргументы с вашими намерениями? Что такое sec1, sec10, min1, min10? – Apurva

ответ

0

Вы должны вызвать PostDelayed(handler, 1000) в каждом Run() для планирования другого хода после 1 вторых:

final Handler handler = new Handler(); 
Runnable myRunnable = new Runnable() { 
    public void run() { 
     ... 
     handler.PostDelayed(this, 1000); 
    } 
} 
handler.PostDelayed(myRunnable, 1000); 

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

+0

, и если он должен быть точным, лучше использовать 'postAtTime' или' postDelayed' с «скорректированным более или менее 1000 мс». – pskink

+0

Можете ли вы показать способ сделать это с помощью кода, который я написал? Потому что почему-то это не работает для меня. –

+0

Замените код '...' кодом вашего метода run(). убедитесь, что обработчик окончательный (см. мое редактирование). И если что-то еще не работает для вас, отправьте сообщения об ошибках. Если люди должны угадать, что не так, вы, скорее всего, не получите никаких ответов. –