我有一个由AlarmReceiver唤醒的服务,每x分钟查找/ some / path /中的文件,如果它发现它们尝试将它们卸载到某个基于云的API端点。
我正在试图弄清楚最优雅的解决方案是什么,以避免并发警报在连续尝试时调用服务并尝试再次卸载相同的文件(如果前一次运行未能在分配的时间内处理完全卸载警报之间。
我尝试了各种方法,包括跟踪哪些文件已被标记为上传(在SharedPreferences和sqlLt中),以及只是测试是否存在正在运行的服务,而不是在AlarmReceiver中启动另一个,但这一切都感觉很亲切哈基
我想知道我是否忽略了一些“正确”的方法来处理这种操作。
答案 0 :(得分:1)
我的第一个建议是停止轮询文件系统。您可以使用FileObserver在指定目录中发生有趣事件时收到通知:https://gist.github.com/shirou/659180
要上传文件,我建议JobService根据需要安排和重试http://toastdroid.com/2015/02/21/how-to-use-androids-job-scheduler/
这应该让您进入事件驱动,可靠的上传设计。这是相对论的简单,我可能会坚持这一点。
但是,正如您的问题所示,让我们尝试尽可能多地批处理工作:
假设您有一个文件上传待处理(等待网络可用),并获得另一个文件创建通知。您可以抓取该作业的JobInfo,cancel作业,并使用新的文件列表reschedule。
只是我的两分钱。