如何使用AlarmManager在AsyncTask中下载失败时运行重试

我使用AlarmManager来运行试图从Web下载文件的服务。 如果失败了,我想在5分钟内重试该服务。

在服务内部我运行AsyncTask来运行我的代码。 据我所知,我可以判断它是否失败的唯一方法是来自onPostExecute()

再次实施该服务重试的最佳方法是什么?

Falmarri的回答是正确的,我不理解你的顾虑。

onPostExecute() ,当你确定出错时:

  1. 调用getSystemService(ALARM_SERVICE)来获取AlarmManager
  2. 调用AlarmManager上的set()在5分钟内触发

如果需要,请在PendingIntentIntent上使用额外内容,以便为您提供有关重试内容的信息,或使用自定义操作字符串来区分重试与计划的警报或其他内容。 请注意,如果使用Intent extras,则需要选择具有PendingIntent的适当标志(例如, FLAG_UPDATE_CURRENT )。

问题是AlarmManager是从一个类启动的,但AsyncTask是在另一个类中,因此启动AlarmManager的类不知道它是否已经失败。

所以? 多个类可以与AlarmManager 。 另外,可以通过其构造函数将数据传递给AsyncTask子类。

此外,您可能需要考虑使用IntentService而不是ServiceAsyncTaskIntentService自动为您提供后台线程。 此外,当没有更多的工作要做时,它会关闭,这也很重要,所以你不会在市场上获得一堆一星评级,抱怨你一直在运行的服务。

我不想从我的Service类的onPostExecute()启动AlarmManager。

为什么不?

如果我从服务中启动一个AlarmManager,那么我就是在创建一个循环函数,我从它自己调用服务。

当然。 那正是你想要的。 无论ServiceAsyncTask还是MyOtherReallyCoolClass是与MyOtherReallyCoolClass实际交谈的人, AlarmManager的是Service本身。重新安排Service的组件是Service本身。