线程执行延迟+ Android

时间:2011-09-29 16:45:37

标签: android

经过多次解决方案的试验(包括在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开启。我的理解是否正确?

1 个答案:

答案 0 :(得分:1)

如果你想拥有一个准确的计时器,我认为你需要获得一个唤醒锁。

查看PowerManager

的文档

您可以获得FULL_WAKE_LOCK以保持屏幕开启,或者PARTIAL_WAKE_LOCK以保持CPU运行。不要忘记将权限添加到AndroidManifest文件中。