实现一个定制的定时器/时钟
我有一个Android应用程序,用户按下开始按钮,并开始收集数据的一些功能。 我有一个自定义的EditText,它显示了所有这个过程所花费的时间,并且每秒更新一次,直到用户按下停止。 我使用如下所示的AsyncTask实现了这一点:
protected class RecTimer extends AsyncTask<Context, Integer, String>
{
@Override
protected String doInBackground( Context... params )
{
int sec=00;
int min=00;
int hours=00;
timerdata=timer.split(":");
hours=Integer.parseInt(timerdata[0]);
min=Integer.parseInt(timerdata[1]);
sec=Integer.parseInt(timerdata[2]);
while(Recording==true)
{
try{
Thread.sleep( 1000 );
publishProgress( sec , min , hours );
sec++;
if(sec==60){
min++;
sec=0;
if(min==60){
hours++;
min=0;
}
}
} catch( Exception e ){
Log.i("makemachine", e.getMessage() );
}
}
return "COMPLETE!";
}
@Override
protected void onPreExecute()
{
Log.i( "makemachine", "onPreExecute()" );
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
//Log.i( "makemachine", "onProgressUpdate(): " + String.valueOf( values[0] ) );
String format = String.format("%%0%dd", 2);
String Sec = String.format(format, values[0]);
String Min = String.format(format, values[1]);
String Hours = String.format(format, values[2]);
((EditText) findViewById(R.id.duration1)).setText(Hours + ":"+ Min + ":" + Sec);
}
@Override
protected void onPostExecute( String result )
{
super.onPostExecute(result);
Log.i( "makemachine", "onPostExecute(): " + result );
}
}
它似乎一开始工作良好,但现在我发现如果应用程序闲置并且焦点不清,计时器可能不会一直算好。 我的意思是,例如,我离开了15分钟的设备,然后看到在我的“时钟”中只有5分钟过去了。 由于观点重新聚焦,一切似乎都能正常工作。
首先,为什么会发生这种情况? 不应该总是在后台执行AsyncTask? 有没有其他更好的方法可以用来实现?
感谢大家提前!
编辑:感谢TrackRuler我实现它像这样:
private Runnable Timer = new Runnable(){
public void run() {
long current = SystemClock.uptimeMillis();
String format = String.format("%%0%dd", 2);
timerdata=timer.split(":");
sec++;
if(sec==60){
min++;
sec=0;
if(min==60){
hours++;
min=0;
}
}
String Sec = String.format(format, sec);
String Min = String.format(format, min);
String Hours = String.format(format, hours);
((EditText) findViewById(R.id.duration1)).setText(Hours + ":"+ Min + ":" + Sec);
TimerHandler.postAtTime(this,
current + 1000);
}
};
从我的主代码中,我从一个处理程序中调用它:TimerHandler.post(Timer);
它现在的作品..我只想知道是否有更新Runnable(?)内的视图的问题
基本上,AsyncTask将在完成时结束。 它不会等待你的睡眠呼叫。
你可能不得不实现Runnable
接口,并在'Runnable'中执行你需要的。
我实施的是这样的,
protected class RecTimer extends AsyncTask<Context, Integer, String>
{
@Override
protected String doInBackground( Context... params )
{
//ToDO........
new Thread(new Timer(CurrentActivity.this)).start();
//ToDO........
}
@Override
protected void onPreExecute()
{
//ToDO........
}
@Override
protected void onProgressUpdate(Integer... values)
{
//ToDO........
}
@Override
protected void onPostExecute( String result )
{
//ToDO........
}
}
我认为这对数据库更新更好。 但对于UI更新,请检查它是否影响UI线程。 现在,这对你的工作是正确的,只是等待主人回答这个问题。 以及我会尽力帮助你...
链接地址: http://www.djcxy.com/p/13001.html