Alp*_*rae 8 android timer systemtime
我需要在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
Run Code Online (Sandbox Code Playgroud)
这正是我所需要的,但是有一个问题:如果我在模拟器或手机上更改时间,计时器将停止运行.这是我更改时间时日志中显示的内容:
D/SystemClock( 331): Setting time of day to sec=1278920137
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument
Run Code Online (Sandbox Code Playgroud)
没有关于计时器被中断的事情,但是在系统时钟改变之后它显然不再运行.只要应用程序正在运行,我就需要让任务始终保持运行.
如果它像这样停止,我怎么能重启计时器?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);
Run Code Online (Sandbox Code Playgroud)
这将使任务在您的应用程序处于活动状态时保持运行。您还可以在 Runnable 内的 postDelayed 中调整延迟率。这种方式只要再做一个Looper就可以半预测了。使用主线程可能合适也可能不合适,具体取决于任务是什么。
还有一个 AlarmManager,您可以通过 Context 接口访问它,这意味着以更精确的时间间隔重复执行任务。使用起来稍微复杂一些,但您可以灵活地使用 RTC 和持久的可重复任务。
AlarmManager manager = mContext.getSystemService(Context.ALARM_SERVICE);
manager.setRepeating(AlarmManager.RTC,
<start_time_millis>,
<period_millis>,
pendingIntent);
Run Code Online (Sandbox Code Playgroud)
例如,待处理的意图可以触发您可以在其他地方收听的广播意图。您可以在自定义 Application 对象的 onCreate 中创建此待定意图,并在 onTerminate() 中取消该意图。
| 归档时间: |
|
| 查看次数: |
2588 次 |
| 最近记录: |