Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓-实现自定义计时器/时钟_Android_Timer_Android Asynctask_Clock - Fatal编程技术网

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

Android 安卓-实现自定义计时器/时钟,android,timer,android-asynctask,clock,Android,Timer,Android Asynctask,Clock,我有一个android应用程序,用户按下开始按钮,一些收集数据的功能就启动了。我有一个自定义的EditText,它显示了所有这个过程所花费的时间,并在用户按下stop之前每秒更新一次。我使用一个异步任务实现了这一点,如下所示: protected class RecTimer extends AsyncTask<Context, Integer, String> { @Override protecte

我有一个android应用程序,用户按下开始按钮,一些收集数据的功能就启动了。我有一个自定义的EditText,它显示了所有这个过程所花费的时间,并在用户按下stop之前每秒更新一次。我使用一个异步任务实现了这一点,如下所示:

    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........
               }          
        }