gpt4 book ai didi

Android - 实现自定义计时器/时钟

转载 作者:行者123 更新时间:2023-11-29 22:08:36 27 4
gpt4 key购买 nike

我有一个 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 分钟过去了。由于 View 重新聚焦,一切似乎又恢复正常。

首先为什么会这样? 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(定时器);

它现在可以工作了。我只想知道更新 Runnable(?) 中的 View 是否有问题

最佳答案

基本上,AsyncTask 将在 while 完成时结束。它不会等待您的 sleep 调用。

您可能必须实现 Runnable 接口(interface),并在“Runnable”中执行您需要的操作。

关于Android - 实现自定义计时器/时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171670/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com