经过多次解决方案的试验(包括在SO上发布问题),我将会正常工作。但没有改善。来到我的问题,我正在实现一个具有倒数计时器的应用程序。我在一个按钮上显示这个(通过禁用click事件就像使用画布一样)。 当用户单击按钮(这是一个单独的按钮)时,我启动计时器。以下是倒数计时器代码,
public class DigitalTimer extends Button{
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
private String timerText;
public DigitalTimer (Context context,int hourstime,int mintime,int sectime){
super(context);
Log.d(TAG,"DigiTimer constructor");
this.context = context;
initialize(hourstime,mintime,sectime,timerType);
setClickable(false);
}
public void initialize(int hourstime,int mintime,int sectime,int timerType){
Log.d(TAG,"DigiTimer initialize");
this.hourstime = hourstime;
this.mintime = mintime;
hour = hourstime;
min = mintime;
sec = sectime;
//Just Thread version
**digiThread = new Thread(){
@Override
public void run(){
while(!isPauseTimer()){
updateTimes();
SystemClock.sleep(UPDATEDELAY);
}
}
};**
//Handler version
/*
handleRunnable = new Runnable(){
public void run(){
updateTimes();
}
};
*/
}
private void updateTimes(){
timerText = String.format(timerFormat,hour,min,sec );
postInvalidate();
sec--;
if(sec < 0){
sec = 59;
min--;
}
if(min < 0){
min = 59;
hour--;
}
if(hour < 0){ //when hour is negative it means the given time completed so we stop the timer & alarm permanantely
hour = 0;
min = 0;
sec = 0;
}
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
Log.d(TAG,"DigiTimer onDraw");
setBackgroundResource(R.drawable.button9patch);
setText(timerText);
}
public void startUpdateTheread(){
//digiHandler.postDelayed(handleRunnable, UPDATEDELAY);
**digiThread.start();**
}
private void startTimersAndAlarms(){
-----------------------
-----------------------
-----------------------
-----------------------
**startUpdateTheread();**
---------------------
---------------------
}
}
最初计时器很好。 但如果倒计时的时间不多(比如5:00:00)那么它的运行正常,直到某个时间(比如说4:00:00),它会推迟计时器更新。 (只是倒计时一分钟它需要更多时间..特别是当用户离开应用程序时) 首先,我尝试使用Handler。我遇到了问题。我认为延迟是因为保持UI线程忙。所以我开发了一个单独的线程。但问题仍然存在。
对不起,很长的帖子。请有人指出发生了什么。这是我缺少的东西还是将代码放在错误的位置?
由于
编辑:我阅读了SystemClock.sleep文档。它说“{此时钟在系统进入深度睡眠状态时停止(CPU关闭,显示黑暗,设备等待外部输入)}”。我明白在运行这个线程时我应该保持CPU。所以根据@Brandon的回答,我应该实现部分POWERLOCK以保持CPU开启。我的理解是否正确?
答案 0 :(得分:1)
如果你想拥有一个准确的计时器,我认为你需要获得一个唤醒锁。
的文档您可以获得FULL_WAKE_LOCK
以保持屏幕开启,或者PARTIAL_WAKE_LOCK
以保持CPU运行。不要忘记将权限添加到AndroidManifest文件中。