我已经解决了我的问题,但我认为我的解决方案不是最好的。
我希望有一个计时器,可以在有限的时间内每秒更改一次文本。我使用Handler和Runnable这样做:
private Handler handler;
private Runnable runnable = new Runnable(){
private Date timeSinceLastTask;
@Override
public void run() {
remainingTime--;
if(timeSinceLastTask != null){
Date timeWokeUp = new Date();
long hoursSinceSleep = timeWokeUp.getTime() - timeSinceLastTask.getTime();
if(hoursSinceSleep > 2000){
Log.e("Error", (int)(hoursSinceSleep/1000) + "sec");
remainingTime - (int)(hoursSinceSleep/1000));
}
}
Log.e("Tick", "Tack " + remainingTime);
if(remainingTime > 0){
updateText();
timeSinceLastTask = new Date();
handler.postDelayed(runnable, 1000);
}else{
handler.removeCallbacks(runnable);
}
}
};
我不得不添加带有日期的部分来计算最后一个任务的执行时间,因为有时候,当设备进入睡眠状态时,我可能需要50秒才能执行下一个任务,因此减慢了倒计时。一秒钟不能超过一秒!
通过我的修复,它很好,但我想知道在睡眠中有时缓慢执行任务的原因是什么。
谢谢!
答案 0 :(得分:2)
当您使用Timer
时,它将绑定到您创建它的线程。这意味着,当您在主线程(UI线程)中创建此Handler时,它执行的runnable必须与其他UI任务一起运行。 可能会也可能不会影响主线程的性能。这取决于您在runnable中运行的任务以及UI的性能。
另一方面,如果您使用Timer
,则表示您正在另一个线程上执行此任务。它不会以任何方式影响主线程。另外,Timer
可以在执行之前安排延迟,并且每次执行时都可以安排。它可以取消,可以停止,可以继续。管理和控制Handler
比<?php
$result = mysqli_query($con,"SELECT * FROM Persons");
$encrypted_columns = array('password','code', 'first_name');
echo "<table border='1'>";
$i = 0;
while($row = $result->fetch_assoc())
{
if ($i == 0) {
$i++;
echo "<tr>";
foreach ($row as $key => $value) {
echo "<th>" . $key . "</th>";
}
echo "</tr>";
}
echo "<tr>";
foreach ($row as $key => $value) {
echo "<td>" . (in_array($key,$encrypted_columns))? simple_decrypt($value , "secured") : $value . "</td>";
}
echo "</tr>";
}
echo "</table>";
mysqli_close($con);
?>
更灵活。