Android服务中的计时器

时间:2013-04-26 07:03:57

标签: java android service

我想创建一个可以每15分钟检查一次所需文件的Android服务。

为此,我创建了一个示例程序,每10秒钟使用TTS播放一个文本。并且还使用警报管理器每30秒调用一次服务

服务是完美的呼叫,即使TTS在第一次完美播放,但是当在50秒后再次呼叫服务时,定时器不是从0开始而是从11,12,13开始 - 即使我已经给出取消()。

有些人可以帮我解决这个问题吗?

以下是代码:

public class ServiceLocation extends Service implements OnInitListener
{

TextToSpeech talker;
Timer t;
public int time = 0;

    @Override
public void onCreate() 
{
    super.onCreate();
    Log.e("Location1", "Inside onCreate");
}

public void onStart(Intent intent, int startId) 
{
    super.onStart(intent, startId);

    t = new Timer();
    Log.e("Location1", "Inside onStart");

    talker = new TextToSpeech(this, this);
    testMethod();
 }

 public void testMethod()
 {      
    //Set the schedule function and rate
    t.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run()    {  

            time += 1;
            String todis = String.valueOf(time);


            if(todis.contains("20"))
            {

                talker.speak("Testing Service in a App",TextToSpeech.QUEUE_ADD,null);

                t.cancel();
                t.purge();
            }
        }   

    }, 0, 1000);
}

  public void onInit(int status) 
  {             
   talker.speak("Testing Service in a App",TextToSpeech.QUEUE_ADD,null);
  }
 }

3 个答案:

答案 0 :(得分:1)

在您的onStart()方法中,您正在初始化Timer(),但您必须检查计时器是否正在运行?如果它正在运行,则取消它并启动一个新的计时器。以下是示例代码:

public static final long NOTIFY_INTERVAL = YOUR_REQUIRED_INTERVAL_IN_SECODE* 1000;

// run on another Thread to avoid crash
private Handler yourHandler = new Handler();
// timer handling
private Timer yourTimer = null;

@Override
public void onCreate() {
    // cancel if already existed
    if(yourTimer != null) {
        yourTimer.cancel();
    }
        // recreate new
        yourTimer = new Timer();

    // schedule task
    yourTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
}

这是您的TimeDisplayTimerTask()

 class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        yourHandler.post(new Runnable() {

            @Override
            public void run() {
                // display toast
                Toast.makeText(getApplicationContext(), "some message",
                        Toast.LENGTH_SHORT).show();
            }

        });
    }

要取消定时器,您只需调用此

即可
if(yourTimer != null) {
            yourTimer.cancel();
        }`

备注:

  1. 固定速率计时器(scheduleAtFixedRate())基于开始时间(因此每次迭代将在startTime + iterationNumber * delayTime执行)。 Link here
  2. 要了解计划和计时器任务,请查看this Link
  3. 感谢。抱歉英语不好。

答案 1 :(得分:0)

TimerTask复习;

                  timer = new Timer();    
                 refresher = new TimerTask() {
                     public void run() {


                        //your code 

                     };
                 };
                first event immediately,  following after 1 seconds each
                 timer.scheduleAtFixedRate(refresher, 0,1000); 

//您可以根据需要的时间更改1000。 1000等于1秒。

您可以将此代码放在服务类oncreate中。您可以在代码部分中每15分钟调用一次要调用的方法。

希望这对你有所帮助。

答案 2 :(得分:0)

您必须每10秒重置一次计时器。

示例代码:

 public void startTimer(){
  t = new Timer();   
  task = new TimerTask() {

    @Override
   public void run() {
    runOnUiThread(new Runnable() {

      @Override
     public void run() {
      TextView tv1 = (TextView) findViewById(R.id.timer);
      tv1.setText(time + "");
      if (time > 0)
       time -= 1;
      else {
       tv1.setText("Welcome");           
      }
     }
    });
   }
  };
  t.scheduleAtFixedRate(task, 0, 1000);
 }

请参阅我的blog post

我希望这会对你有所帮助。