倒数计时器跳过几毫秒
countdowntimer skipping some milliseconds
如您所见,上次调用 onTick 发生了 2 秒,然后下一次调用将近 2 秒后。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
this.setContentView(tv);
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss:SSS");
formatter.setLenient(false);
newTime = "31.12.2015, 23:59:59:999";
try {
newDate = formatter.parse(newTime);
milliseconds = newDate.getTime();
currentTime = System.nanoTime();
diff = milliseconds - currentTime;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MyCount counter = new MyCount(milliseconds, 1000);
counter.start();
}
CountDownTimer
public class MyCount extends CountDownTimer {
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
serverUptimeSeconds = (millisUntilFinished - System
.currentTimeMillis()) / 1000;
String serverUptimeText = String.format(
"%d days %d hours %d minutes %d seconds",
serverUptimeSeconds / 86400,
(serverUptimeSeconds % 86400) / 3600,
((serverUptimeSeconds % 86400) % 3600) / 60,
((serverUptimeSeconds % 86400) % 3600) % 60);
tv.setText(serverUptimeText);
}
}
Output:
10 seconds
8 seconds
6 seconds
4 seconds
P.S ~ 查看视频了解更多信息
我猜是计算有误,我是这样工作的:
[已编辑] 刚刚再次测试它并且工作正常,在 1 秒内更新 1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = new TextView(this);
this.setContentView(tv);
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss:SSS");
formatter.setLenient(false);
String newTime = "31.12.2015, 23:59:59:999";
long diff = 0;
try {
Date newDate = formatter.parse(newTime);
milliseconds = newDate.getTime();
long currentTime = System.currentTimeMillis();
diff = milliseconds - currentTime;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MyCount counter = new MyCount(diff, 1000);
counter.start();
}
我看到你也在用纳秒,试试用毫秒代替。
public class MyCount extends CountDownTimer {
private long serverUptimeSeconds;
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
//serverUptimeSeconds = (millisUntilFinished - System
// .currentTimeMillis()) / 1000;
int seconds = (int) (millisUntilFinished / 1000) % 60 ;
int minutes = (int) ((millisUntilFinished / (1000*60)) % 60);
int hours = (int) ((millisUntilFinished / (1000*60*60)) % 24);
String serverUptimeText = String.format(
"%d hours %d minutes %d seconds",
hours,
minutes,
seconds);
tv.setText(serverUptimeText);
}
}
希望对您有所帮助 ;)
试试这个:
TimerTask runTimerTask = new TimerTask() {
@Override
public void run() {
// your code
});
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(runTimerTask, 0, 500);
如您所见,上次调用 onTick 发生了 2 秒,然后下一次调用将近 2 秒后。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
this.setContentView(tv);
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss:SSS");
formatter.setLenient(false);
newTime = "31.12.2015, 23:59:59:999";
try {
newDate = formatter.parse(newTime);
milliseconds = newDate.getTime();
currentTime = System.nanoTime();
diff = milliseconds - currentTime;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MyCount counter = new MyCount(milliseconds, 1000);
counter.start();
}
CountDownTimer
public class MyCount extends CountDownTimer {
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
serverUptimeSeconds = (millisUntilFinished - System
.currentTimeMillis()) / 1000;
String serverUptimeText = String.format(
"%d days %d hours %d minutes %d seconds",
serverUptimeSeconds / 86400,
(serverUptimeSeconds % 86400) / 3600,
((serverUptimeSeconds % 86400) % 3600) / 60,
((serverUptimeSeconds % 86400) % 3600) % 60);
tv.setText(serverUptimeText);
}
}
Output:
10 seconds
8 seconds
6 seconds
4 seconds
P.S ~ 查看视频了解更多信息
我猜是计算有误,我是这样工作的:
[已编辑] 刚刚再次测试它并且工作正常,在 1 秒内更新 1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = new TextView(this);
this.setContentView(tv);
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss:SSS");
formatter.setLenient(false);
String newTime = "31.12.2015, 23:59:59:999";
long diff = 0;
try {
Date newDate = formatter.parse(newTime);
milliseconds = newDate.getTime();
long currentTime = System.currentTimeMillis();
diff = milliseconds - currentTime;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MyCount counter = new MyCount(diff, 1000);
counter.start();
}
我看到你也在用纳秒,试试用毫秒代替。
public class MyCount extends CountDownTimer {
private long serverUptimeSeconds;
public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
}
@Override
public void onTick(long millisUntilFinished) {
//serverUptimeSeconds = (millisUntilFinished - System
// .currentTimeMillis()) / 1000;
int seconds = (int) (millisUntilFinished / 1000) % 60 ;
int minutes = (int) ((millisUntilFinished / (1000*60)) % 60);
int hours = (int) ((millisUntilFinished / (1000*60*60)) % 24);
String serverUptimeText = String.format(
"%d hours %d minutes %d seconds",
hours,
minutes,
seconds);
tv.setText(serverUptimeText);
}
}
希望对您有所帮助 ;)
试试这个:
TimerTask runTimerTask = new TimerTask() {
@Override
public void run() {
// your code
});
};
Timer timer = new Timer();
timer.scheduleAtFixedRate(runTimerTask, 0, 500);