AlarmManager定时循环操作的重叠问题

dferererer 2014-03-18 04:37:23
用AlarmManager做了个定时重复操作的功能,调用的是个服务,有个问题:如果服务时间较长,那上次服务还没完成、下次时间就到了,会出现重叠。但我不想要重叠,应该怎么办?

部分代码如下:

		Intent intent = new Intent(context, cls);
intent.setAction(action);
PendingIntent pendingIntent = PendingIntent.getService(context, 0,intent,PendingIntent.FLAG_UPDATE_CURRENT);

//触发服务的起始时间
long triggerAtTime = SystemClock.elapsedRealtime();

//使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service
manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime,seconds * 1000, pendingIntent);


如果seconds为5秒,而服务时间可达数分钟(服务里用了线程,不然会出现ANR),那5秒以后,下次循环到来,而服务还在进行,于是就会出现重入,但这不是我想要的,不知如何避免。注:在服务中用synchronized好像也不行,会一直攒着,好像还能导致界面响应变慢。

请高手指点!
...全文
256 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dferererer 2014-03-19
  • 打赏
  • 举报
回复
请各位大神帮忙,真心感谢!
dferererer 2014-03-19
  • 打赏
  • 举报
回复
引用 7 楼 xyzdumpling 的回复:
在android中还没试过AlarmService但是在WPF或其他客户端技术下都是用类似js中的SetTimeout,运行完服务中就在SetTimeout,不知道在android中AlarmService的服务程序响应之后可不可以先unregister,然后执行完之后再重现register,当然这样间隔就不准,但绝对不会堆积一堆。
倒是可以自己加个标记判断,但很不优雅。感觉框架应该自带这方面的支持,毕竟是一个很合理很常见的需求啊。
徐牛 2014-03-19
  • 打赏
  • 举报
回复
在android中还没试过AlarmService但是在WPF或其他客户端技术下都是用类似js中的SetTimeout,运行完服务中就在SetTimeout,不知道在android中AlarmService的服务程序响应之后可不可以先unregister,然后执行完之后再重现register,当然这样间隔就不准,但绝对不会堆积一堆。
哎,真难 2014-03-19
  • 打赏
  • 举报
回复
引用 5 楼 dferererer 的回复:
[quote=引用 4 楼 heaimnmn 的回复:] [quote=引用 3 楼 dferererer 的回复:] [quote=引用 2 楼 heaimnmn 的回复:] 我觉得如果该服务还没完成,下个服务就排进来了,是不是要阻塞上次的服务,而执行下次的服务了
不需要这样,后继操作直接放弃就行。[/quote]那后进来的进程阻塞了,会不会anr了,,,[/quote]不存在ANR的问题,后来的操作一看前面的还没完成,就直接返回了。而且服务中的操作都是多线程的,不存在ANR的问题。[/quote]cpu长时间无响应啊,你一个服务对应一个进程处理,后进程长期等待,就会anr,,,
dferererer 2014-03-19
  • 打赏
  • 举报
回复
引用 4 楼 heaimnmn 的回复:
[quote=引用 3 楼 dferererer 的回复:] [quote=引用 2 楼 heaimnmn 的回复:] 我觉得如果该服务还没完成,下个服务就排进来了,是不是要阻塞上次的服务,而执行下次的服务了
不需要这样,后继操作直接放弃就行。[/quote]那后进来的进程阻塞了,会不会anr了,,,[/quote]不存在ANR的问题,后来的操作一看前面的还没完成,就直接返回了。而且服务中的操作都是多线程的,不存在ANR的问题。
哎,真难 2014-03-19
  • 打赏
  • 举报
回复
引用 3 楼 dferererer 的回复:
[quote=引用 2 楼 heaimnmn 的回复:] 我觉得如果该服务还没完成,下个服务就排进来了,是不是要阻塞上次的服务,而执行下次的服务了
不需要这样,后继操作直接放弃就行。[/quote]那后进来的进程阻塞了,会不会anr了,,,
dferererer 2014-03-19
  • 打赏
  • 举报
回复
引用 2 楼 heaimnmn 的回复:
我觉得如果该服务还没完成,下个服务就排进来了,是不是要阻塞上次的服务,而执行下次的服务了
不需要这样,后继操作直接放弃就行。
哎,真难 2014-03-19
  • 打赏
  • 举报
回复
我觉得如果该服务还没完成,下个服务就排进来了,是不是要阻塞上次的服务,而执行下次的服务了

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧