android定时器开始和停止,更改Android系统时钟停止定时器。 我如何重新启动它们?...

我需要在Android应用程序中运行定期任务。 我目前使用这样的计时器:final Handler guiHandler = new Handler();

// the task to run

final Runnable myRunnable = new Runnable() {

@Override

public void run() {

doMyStuff();

}

};

Timer timer = new Timer();

timer.schedule(new TimerTask() {

@Override

public void run() {

guiHandler.post(myRunnable);

}

}, 0, 30000); // run every 30 seconds

这正是我所需要的,但有一个问题:如果我改变模拟器或手机上的时间,计时器将停止运行。 这是我在更改时间时在日志中显示的内容:D/SystemClock( 331): Setting time of day to sec=1278920137

W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument

定时器没有被中断,但在系统时钟改变后显然不再运行。 只要应用程序正在运行,我需要任务始终保持运行状态。

如果它像这样停止,我该如何重新启动计时器? Timer或TimerTask没有方法检查它是否正在运行,所以我不知道什么时候重新安排它。 有任何想法吗?

我认为有几种方法可以做到这一点。 在任何情况下,我都不会使用计时器。

您可以使用处理程序在postDelayed调用中运行您的任务。 您的任务将不得不重新注册自身内部的处理程序。final int ONE_SECOND = 1000; // one second

final Handler handler = new Handler();

handler.postDelayed(new Runnable() {

public void run() {

... // do some stuff

if (expression) {

handler.postDelayed(this, ONE_SECOND);

}

}

}, ONE_SECOND);

这将保持任务在您的应用程序处于活动状态时运行。 您也可以调整Runnable中postDelayed的延迟率。 只要你制作另一个Looper,这种方式是半可预测的。 根据任务的不同,使用主线程可能适用也可能不适用。

还有一个AlarmManager,您可以通过Context界面访问,这是为了以更精确的时间间隔重复执行任务任务。 使用起来稍微复杂一点,但您可以灵活地使用RTC和持久可重复的任务。AlarmManager manager = mContext.getSystemService(Context.ALARM_SERVICE);

manager.setRepeating(AlarmManager.RTC,

,

,

pendingIntent);

例如,挂起的意图可以触发您可以在其他地方收听的广播意图。 您可以在自定义应用程序对象的onCreate中创建此pendingintent,并取消onTerminate()中的意图。

链接地址: http://www.djcxy.com/p/2087.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值