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

时间:2010-09-12 03:56:35

标签: java android service android-asynctask alarmmanager

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

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

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

1 个答案:

答案 0 :(得分:3)

Falmarri的回答是正确的,我不明白你的担忧。

onPostExecute()中,当您确定事情出错时:

  1. 致电getSystemService(ALARM_SERVICE)以获取AlarmManager
  2. set()上致电AlarmManager,在5分钟内触发您
  3. 如果需要,请在Intent的{​​{1}}上使用附加内容,以便为您提供有关重试内容的信息,或使用自定义操作字符串来区分重试与预定警报或其他内容。请注意,如果您使用PendingIntent个额外内容,则需要选择包含Intent的相应标记(例如PendingIntent)。

      

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

    所以?多个班级可以与FLAG_UPDATE_CURRENT交谈。此外,您可以通过其构造函数将数据传递到AlarmManager子类。

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

      

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

    为什么不呢?

      

    如果我从服务中启动一个AlarmManager,那么我就是在创建一个循环函数   我自己打电话给服务。

    当然。那正是你想要的。问题不在于IntentServiceServiceAsyncTask是否与MyOtherReallyCoolClass实际交谈的人 - 重新安排AlarmManager的组件是Service本身。