2

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

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

该服务被完美调用,甚至第一次完美播放 TTS 但是当 50 秒后再次调用该服务时,计时器不是从 0 开始,而是从 11、12、13 开始 - 即使我已经给出了 cancel() .

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

下面是代码:

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);
  }
 }
4

3 回答 3

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 处执行)。链接在这里
  2. 要了解计划和计时器任务,请查看此链接

谢谢。抱歉英语不好。

于 2015-10-17T07:39:19.237 回答
0

You have to reset your timer for every 10 seconds.

sample code:

 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);
 }

for breif example see my blog post.

I hope this will help you.

于 2013-04-26T07:29:49.630 回答
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 中。您可以在代码部分中每十五分钟调用一次您想要调用的方法。

希望这对您有所帮助。

于 2013-04-26T07:14:03.600 回答