Попытка сделать небольшой таймер обратного отсчета в моем приложении, но он не работает.
Идея - отсчет времени до определенного времени. Сначала по дням и когда он приближается, часами.
Следующий метод находится внутри моего Fragmentclass.java (так что это фрагмент)
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = currentTime - endTime;
long seconds = remaining / 1000 % 60;
new CountDownTimer(seconds, 1000) {
TextView tv = (TextView)getActivity().findViewById(R.id.introTimeLeft);
public void onTick(long millisUntilFinished) {
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = currentTime - endTime;
long hours = remaining / 3600000;
long mins = remaining / 60000 % 60;
long seconds = remaining / 1000 % 60;
long days = hours / 24;
String remainingText = String.valueOf(days) + " days";
Log.i("countdown",String.valueOf(days));
tv.setText("Days left: " + days);
}
public void onFinish() {
Log.i("countdown","CD Finished");
tv.setText("CD Finished!");
}
}.start();
}
Обратите внимание, что значение текстового поля сейчас просто для тестирования, но я не могу заставить его отображать обратный отсчет.
И это лучший подход?
Вот значения переменных, если я запускаю ваш код:
endTime = 1348902045437
currentTime = 1340645325437
remaining = -8256720000
seconds = 0
как вы видите seconds == 0
, и это причина.
Также отметим, что первый аргумент в CountDownTimer(long millisInFuture, long countDownInterval)
конструктор является
Количество миллисов в будущем от вызова до начала() до тех пор, пока не будет отсчитан обратный отсчет, и вызывается функция onFinish().
Таким образом, фиксированный код будет:
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = endTime - currentTime;
new CountDownTimer(remaining, 1000) {
...
ОБНОВИТЬ:
Странно, что он не обновляет текстовое представление. Единственная идея, которую я могу предложить, - запустить вызовы обновлений в основном потоке пользовательского интерфейса. Это должно быть примерно так:
public void onTick(long millisUntilFinished) {
final String days = .. // some code to generate days
getActivity().runOnUiThread(new Runnable() {
public void run() {
tv.setText("Days left: " + days);
}
});
}
public void onFinish() {
Log.i("countdown","CD Finished");
getActivity().runOnUiThread(new Runnable() {
public void run() {
tv.setText("CD Finished!");
}
});
}
Если это не поможет - тогда у меня нет идей.