2015-07-08 7 views
2

Я пишу свое первое приложение, в котором мне нужно обновлять число в текстовом представлении каждую секунду до нажатия кнопки. Использование обработчика кажется невозможным, потому что номер создается и хранится вне обработчика, но он не может быть объявлен окончательным, потому что его нужно изменить. Thread.sleep также кажется, что приложение зависает бесконечно, прежде чем выполняется какой-то код, написанный над ним.Обновление числа в TextView каждую секунду

final TextView countView = (TextView) findViewById(R.id.counter); 
     countView.setText("100,000,000,000"); 

    //set a Calendar object to be 00:00:00:00 on Jan 1, 2015 
    final Calendar startTime = Calendar.getInstance(); 
    startTime.set(2015, 0, 0, 12, 0, 0); 
    startTime.set(Calendar.MILLISECOND, 0); 

final Button startButton = (Button) findViewById(R.id.startButton); 
     startButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       //set a Calendar to be the time that the button is clicked and find the difference in ms between it and startTime 
       Calendar nowTime = Calendar.getInstance(); 
       double milStart = startTime.getTimeInMillis(); 
       double milNow = nowTime.getTimeInMillis(); 
       double diff = (milNow-milStart)/1000;  //difference in seconds between "start" date and current date 

       double total = 100000000000L; //# that needs to be updated 
       for(long i = 0L; i < diff; i++) { 
        total += 1.8; 
       } 
       countView.setText(NumberFormat.getInstance().format(total)); 

мне нужно продолжать увеличивать total на 1,8 каждый второй или на 1 каждые 556 миллисекунд.

while(true) { 
    countView.setText(NumberFormat.getInstance().format(total)); 
    total += 1.8; 
    try { 
     Thread.sleep(1000); 
     } catch (InterruptedException e) {} 
} 

Вызывает приложение, чтобы повесить на неопределенное время, как только кнопка нажата, так что даже первый countView.setText(NumberFormat.getInstance().format(total)); не выполняет.

Использование обработчика для меня не представляется возможным, так как total не может работать, если объявлено окончательным, но создание переменной внутри обработчика и циклирование приведет к тому, что значение никогда не изменится.

У меня отсутствует очевидное решение? Это моя первая реальная попытка с Java, так что это все ново для меня

ответ

5

вы можете использовать обработчик

Handler h = new Handler(); 
final Runnable r = new Runnable() { 
     int count = 0; 
     @Override 
     public void run() { 
      count++; 
      textView.setText(""+count*1.8); 
      h.postDelayed(this, 1000); //ms 
     } 
    }; 
h.postDelayed(r, 1000); // one second in ms 

для остановки вы можете использовать h.removeCallbacksAndMessages(null);

+0

Это работает, но не решает проблему я имею , У меня есть число, которое определено ранее в коде, и вам нужно обновить номер _that_, но не может перетащить его в runnable, потому что это не окончательный. Он не может быть объявлен окончательным, поскольку ему необходимо изменить – FutureShocked

+1

, чтобы определить это число в своей деятельности «глобально», восстановить/воссоздать/получить из любого места в методе 'onCreate' или где угодно. после этого ставьте выше код, и тогда вы сможете ++ этот int внутри 'Runnable' – snachmsm

Смежные вопросы