实现一个定制的定时器/时钟

我有一个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

上一篇: implement a custom timer/clock

下一篇: Reschedule timer in android