Java 在倒计时中执行计时器计算是否有效->;onTick()?
我正在文本视图中显示一个可视化倒计时,我想知道是否有更有效的方法来实现倒计时逻辑。我觉得在每个刻度上计算(即使计算很简单)可能会随着时间消耗电池Java 在倒计时中执行计时器计算是否有效->;onTick()?,java,android,performance,countdowntimer,Java,Android,Performance,Countdowntimer,我正在文本视图中显示一个可视化倒计时,我想知道是否有更有效的方法来实现倒计时逻辑。我觉得在每个刻度上计算(即使计算很简单)可能会随着时间消耗电池 long now = Calendar.getInstance().getTimeInMillis(); Calendar midnight = new GregorianCalendar(); midnight.set(Calendar.HOUR_OF_DAY, 0); midnight.set(Calendar.MINUTE, 0); midni
long now = Calendar.getInstance().getTimeInMillis();
Calendar midnight = new GregorianCalendar();
midnight.set(Calendar.HOUR_OF_DAY, 0);
midnight.set(Calendar.MINUTE, 0);
midnight.set(Calendar.SECOND, 0);
midnight.set(Calendar.MILLISECOND, 0);
midnight.add(Calendar.DAY_OF_MONTH, 1);
long deadline = midnight.getTimeInMillis();
long diff = deadline - now;
new CountDownTimer(diff, 1000) {
public void onTick(long millisUntilFinished) {
long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished) - (days * 24);
long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - (days * 24 * 60) - (hours * 60);
long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - (days * 24 * 60 * 60) - (hours * 60 * 60) - (minutes * 60);
String fDays = String.format(Locale.FRANCE, "%d", days) + "J";
String fHours = String.format(Locale.FRANCE, "%d", hours) + "h";
String fMinutes = String.format(Locale.FRANCE, "%d", minutes) + "min";
String fSeconds = String.format(Locale.FRANCE, "%d", seconds) + "s";
fMinutes = (minutes < 10) ? "0" + fMinutes : fMinutes;
fSeconds = (seconds < 10) ? "0" + fSeconds : fSeconds;
String countDown = days > 0 ? fDays : "";
countDown += (!countDown.isEmpty() || hours > 0) ? fHours : null;
countDown += (!countDown.isEmpty() || minutes > 0) ? fMinutes : null;
countDown += (!countDown.isEmpty() || seconds > 0) ? fSeconds : null;
mTextView.setText(countDown);
}
public void onFinish() {
mTextView.setText("done!");
}
}.start();
long now=Calendar.getInstance().getTimeInMillis();
日历午夜=新的格里高利安日历();
午夜。设置(日历。一天中的小时,0);
午夜。设置(日历。分钟,0);
午夜。设置(日历秒,0);
午夜。设置(日历毫秒,0);
午夜。添加(日历日,每月1日);
长截止日期=午夜。getTimeInMillis();
long diff=截止日期-现在;
新的倒计时(差,1000){
公共void onTick(长毫秒未完成){
长天数=时间单位。毫秒。今天(毫秒到完成);
长时间=时间单位。毫秒。到小时(毫秒到完成)-(天*24);
长分钟=时间单位。毫秒。到分钟(毫秒到完成)-(天*24*60)-(小时*60);
长秒=时间单位毫秒到秒(毫秒到完成)-(天*24*60*60)-(小时*60*60)-(分钟*60);
String fDays=String.format(Locale.FRANCE,“%d”,days)+“J”;
String fHours=String.format(Locale.FRANCE,“%d”,hours)+“h”;
String fMinutes=String.format(Locale.FRANCE,“%d”,分钟)+“min”;
String fSeconds=String.format(Locale.FRANCE,“%d”,秒)+“s”;
分钟数=(分钟数<10)-“0”+分钟数:分钟数;
fSeconds=(秒<10)?“0”+fSeconds:fSeconds;
字符串倒计时=天>0?F天:“”;
倒计时+=(!countDown.isEmpty()| | hours>0)?f小时:空;
倒计时+=(!countDown.isEmpty()| |分钟数>0)?fMinutes:null;
倒计时+=(!countDown.isEmpty()| |秒>0)?fSeconds:null;
mTextView.setText(倒计时);
}
公共无效onFinish(){
mTextView.setText(“完成!”);
}
}.start();
我建议使用RxJava 2的intervalRange
,在后台线程上使用subscribeOn(computation())
,然后订阅更改。这是更可扩展的。你可以使用库“CoutDownView”