Я предполагаю, что вы не знаете об Android Chronometer
- у него уже есть базовая функция секундомера. Вам нужно немного поработать с его особенностями, но нетрудно заставить его делать то, что вы хотите, как только вы поймете, как это работает.
Существует несколько способов расчета времени на телефоне, но есть два основных:
«Реальное время», такое как сейчас по моим компьютерным часам, в Англии 11:23. Однако это может измениться, если мой компьютер подключится к серверу времени и получит сообщение о том, что у него неправильное время, или если я путешествовал с ноутбуком и пересек границу часового пояса. Использование этого может нанести ущерб вашему секундомеру, так как измеренное время может измениться в любое время.
«Истекшее время с момента загрузки», которое представляет собой количество миллисекунд с момента включения телефона. Это число не имеет никакого отношения к реальному времени, но оно будет вести себя совершенно предсказуемо. Это то, что использует Android-хронометр.
Chronometer
- это, по сути, таймер «обратного отсчета», сравнивающий текущий SystemClock.elapsedRealtime()
с elapsedRealtime (), который был установлен для его базового времени. Разница между ними, разделенная на 1000, представляет собой количество секунд с момента запуска таймера. Однако, если вы остановите таймер, а затем запустите его снова, вы получите нелогичный результат - таймер покажет прошедшее время, как если бы оно никогда не останавливалось. Это потому, что вам нужно настроить его базовое время, чтобы учитывать время, когда оно было остановлено Это просто сделать:
// When you're stopping the stopwatch, use this
// This is the number of milliseconds the timer was running for
elapsedTimeBeforePause = SystemClock.elapsedRealtime() - timer.getBase();
// When you're starting it again:
timer.setBase(SystemClock.elapsedRealtime() - elapsedTimeBeforePause);
Редактировать: вот полный код основного секундомера, который отображает ваше время в TextView, а не в виджете Хронометр, объявленном в вашем XML-файле.
public class TestProject extends Activity {
TextView textGoesHere;
long startTime;
long countUp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Chronometer stopWatch = (Chronometer) findViewById(R.id.chrono);
startTime = SystemClock.elapsedRealtime();
textGoesHere = (TextView) findViewById(R.id.textGoesHere);
stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
@Override
public void onChronometerTick(Chronometer arg0) {
countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
String asText = (countUp / 60) + ":" + (countUp % 60);
textGoesHere.setText(asText);
}
});
stopWatch.start();
}
}
В вашем main.xml вы должны иметь это
<Chronometer android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chrono"
android:visibility="gone"/>
Несомненно, есть способ заставить хронометр работать без объявления его в XML-файле, но конструктор Chronometer stopwatch = new Chronometer(this);
не работал должным образом.
Приведенный выше код отображает прошедшее время очень простым способом. Например, если прошло всего 5 секунд, он покажет 0:5
, а не 0:05
, который вы, вероятно, хотите. Исправить это несложно, но я оставлю это на ваше усмотрение! :)