Android 安卓-实现自定义计时器/时钟
我有一个android应用程序,用户按下开始按钮,一些收集数据的功能就启动了。我有一个自定义的EditText,它显示了所有这个过程所花费的时间,并在用户按下stop之前每秒更新一次。我使用一个异步任务实现了这一点,如下所示:Android 安卓-实现自定义计时器/时钟,android,timer,android-asynctask,clock,Android,Timer,Android Asynctask,Clock,我有一个android应用程序,用户按下开始按钮,一些收集数据的功能就启动了。我有一个自定义的EditText,它显示了所有这个过程所花费的时间,并在用户按下stop之前每秒更新一次。我使用一个异步任务实现了这一点,如下所示: protected class RecTimer extends AsyncTask<Context, Integer, String> { @Override protecte
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 );
}
}
在我的主代码中,我通过处理程序调用它:
TimerHandler.post(计时器)
现在它可以用了。。我只是想知道在更新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........
}
}
受保护类RecTimer扩展异步任务
{
@凌驾
受保护字符串doInBackground(上下文…参数)
{
//待办事项。。。。。。。。
新线程(新计时器(CurrentActivity.this)).start();
//待办事项。。。。。。。。
}
@凌驾
受保护的void onPreExecute()
{
//待办事项。。。。。。。。
}
@凌驾
受保护的void onProgressUpdate(整型…值)
{
//待办事项。。。。。。。。
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
//待办事项。。。。。。。。
}
}
我认为这对于数据库更新更好。但是对于UI更新,检查它是否影响UI线程。现在这个对你有用了,就等大师回答这个问题吧。我会尽力帮你的…非常感谢!我现在试着用一个处理程序和一个Runnable来完成它。类似TimerHandler.post(计时器)的东西;在Timer runnable中,我有所有类似于AsyncTask和TimerHandler.PostAttribute的代码(这个,当前+1000;}这就是你的意思吗?如果我在计时器内更新视图也没有问题吗?@george这与我上面的意思类似。它如何适合你?如果你不是这个意思,在外部创建一个
Runnable
并从doInBackground()调用Runnable
)
。它将在postExecute()
时准确地给出结果。它现在可以工作了,但我不知道更新runnable内部的视图是否合适。我完全删除了AsyncTask(另请参见编辑),所以我不明白您所说的“从doInBackground()调用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........
}
}