Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在倒计时中执行计时器计算是否有效->;onTick()?_Java_Android_Performance_Countdowntimer - Fatal编程技术网

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”