1

を使用しAlarmManagerて、Web からファイルをダウンロードしようとするサービスを実行します。失敗した場合は、5 分後にそのサービスを再試行したいと思います。

サービス内でAsyncTaskを実行してコードを実行します。私の知る限り、失敗したかどうかを判断できる唯一の方法はonPostExecute().

そのサービスの再試行を再度実装する最良の方法は何ですか?

4

1 に答える 1

3

Falmarri の答えは正しいものであり、あなたの懸念は理解できません。

onPostExecute()、問題が発生したと判断した場合:

  1. 電話getSystemService(ALARM_SERVICE)して入手AlarmManager
  2. を呼び出しset()て、AlarmManager5 分後にトリガーします

必要に応じて、 でエクストラを使用してIntentPendingIntent再試行する内容に関する情報を提供するか、カスタム アクション文字列を使用して、スケジュールされたアラームなどと再試行を区別します。Intentエクストラを使用する場合は、適切なフラグを選択する必要があることに注意してくださいPendingIntent(例: FLAG_UPDATE_CURRENT)。

問題は、AlarmManager はあるクラスから開始されますが、AsyncTask は別のクラスにあるため、AlarmManager を開始するクラスは、それが失敗したかどうかを認識しません。

そう?複数のクラスが と通信できAlarmManagerます。AsyncTaskまた、コンストラクターを介してサブクラスにデータを自由に渡してください。

また、 と ではなく を使用することを検討することもできIntentServiceます。バックグラウンドスレッドを自動的に提供します。さらに、これ以上行うべき作業がなくなるとシャットダウンします。これも重要です。そのため、常に実行しているサービスについて不平を言う市場での 1 つ星の評価がたくさん得られることはありません。ServiceAsyncTaskIntentService

Service クラスの onPostExecute() から AlarmManager を開始したくありません。

なぜだめですか?

Service 内から AlarmManager を開始すると、それ自体から Service を呼び出す繰り返し関数を作成することになります。

もちろん。それがあなたが望むものです。が実際に話しているのが かServiceかかは問題ではありません。を再スケジュールしているコンポーネントはそのものです。AsyncTaskMyOtherReallyCoolClassAlarmManagerServiceService

于 2010-09-12T11:33:17.017 に答える