2011-09-29 151 views
0

经过多次解决方案的试用(包括在SO上发布问题),我会努力工作。但没有改善。回到我的问题,我正在实施一个有倒数计时器的应用程序。我在一个按钮上显示了它(通过禁用点击事件就像使用画布一样)。 当用户点击一个按钮(这是一个单独的按钮)时,我启动计时器。下面是倒计时代码,线程执行延迟+ Android

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),它会延迟计时器更新。 (只需倒计时一分钟就会花费更多时间......特别是当用户不在应用程序中时) 首先,我尝试使用处理程序。我遇到了问题。我认为延迟是因为保持UI线程繁忙。所以我开发了一个单独的线程。但问题仍然存在。

对不起,很长的文章。请有人指出发生了什么事。那是我遗失的东西还是把代码放在错误的地方?

感谢

编辑:我读SystemClock.sleep文档。它说:“{当系统进入深度睡眠(CPU关闭,显示黑暗,设备等待外部输入)时,此时钟停止}”。我明白我应该在运行此线程时保持CPU处于开启状态。所以根据@Brandon的回答,我应该实现部分POWERLOCK以保持CPU处于开启状态。我的理解是否正确?

回答

1

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

退房的PowerManager

的文档,你可以得到一个FULL_WAKE_LOCK保持在屏幕上,或PARTIAL_WAKE_LOCK保持CPU的运行。不要忘记将权限添加到您的AndroidManifest文件中。

+0

感谢您的回答。是。我已经实现了唤醒锁来保持屏幕开启。这是工作。但我的问题是当用户退出App时管理倒数计时器。即当用户退回到应用程序时,如果用户退出(主页或后退按钮)应用程序,当计时器显示03:30:00 ... 1分钟后,应该显示03:31:00。它也显示了这一点,但有时延迟了一段时间。 – droidsites

+0

请看我的编辑 – droidsites