我想创建一个可以每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);
}
}
答案 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 :(得分: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。
我希望这会对你有所帮助。