我使用 anAlarmManager
来运行一个尝试从网络下载文件的服务。如果失败,我想在 5 分钟内重试该服务。
在服务内部,我运行一个AsyncTask
来运行我的代码。据我所知,我可以判断它是否失败的唯一方法是从onPostExecute()
.
再次实施该服务重试的最佳方法是什么?
我使用 anAlarmManager
来运行一个尝试从网络下载文件的服务。如果失败,我想在 5 分钟内重试该服务。
在服务内部,我运行一个AsyncTask
来运行我的代码。据我所知,我可以判断它是否失败的唯一方法是从onPostExecute()
.
再次实施该服务重试的最佳方法是什么?
Falmarri 的回答是正确的,我不明白你的担忧。
在onPostExecute()
中,当您确定事情出错时:
getSystemService(ALARM_SERVICE)
获取AlarmManager
set()
5AlarmManager
分钟触发你Intent
如果需要,请在 中使用附加功能PendingIntent
为您提供有关重试内容的信息,或使用自定义操作字符串将重试与计划的警报区分开来,或其他内容。请注意,如果您使用附加功能,则需要使用(例如, )Intent
选择适当的标志。PendingIntent
FLAG_UPDATE_CURRENT
问题是 AlarmManager 是从一个类启动的,但 AsyncTask 在另一个类中,因此启动 AlarmManager 的类不知道它是否失败。
所以?多个类可以与AlarmManager
. 此外,您可以随意AsyncTask
通过其构造函数将数据传递给您的子类。
此外,您可能需要考虑使用 anIntentService
而不是Service
and AsyncTask
。IntentService
自动给你一个后台线程。另外,当没有更多工作要做时它会关闭,这也很重要,因此您不会在市场上获得一堆一星评级来抱怨您一直在运行的服务。
我不想从我的 Service 类的 onPostExecute() 启动一个 AlarmManager。
为什么不?
如果我从服务中启动一个 AlarmManager,那么我就在创建一个循环函数,我在其中从自身调用服务。
当然。那就是你想要的。与实际交谈的那个Service
或 theAsyncTask
或 the无关紧要- 重新安排 the 的组件是它本身。MyOtherReallyCoolClass
AlarmManager
Service
Service