を使用しAlarmManager
て、Web からファイルをダウンロードしようとするサービスを実行します。失敗した場合は、5 分後にそのサービスを再試行したいと思います。
サービス内でAsyncTask
を実行してコードを実行します。私の知る限り、失敗したかどうかを判断できる唯一の方法はonPostExecute()
.
そのサービスの再試行を再度実装する最良の方法は何ですか?
を使用しAlarmManager
て、Web からファイルをダウンロードしようとするサービスを実行します。失敗した場合は、5 分後にそのサービスを再試行したいと思います。
サービス内でAsyncTask
を実行してコードを実行します。私の知る限り、失敗したかどうかを判断できる唯一の方法はonPostExecute()
.
そのサービスの再試行を再度実装する最良の方法は何ですか?
Falmarri の答えは正しいものであり、あなたの懸念は理解できません。
でonPostExecute()
、問題が発生したと判断した場合:
getSystemService(ALARM_SERVICE)
して入手AlarmManager
set()
て、AlarmManager
5 分後にトリガーします必要に応じて、 でエクストラを使用してIntent
、PendingIntent
再試行する内容に関する情報を提供するか、カスタム アクション文字列を使用して、スケジュールされたアラームなどと再試行を区別します。Intent
エクストラを使用する場合は、適切なフラグを選択する必要があることに注意してくださいPendingIntent
(例: FLAG_UPDATE_CURRENT
)。
問題は、AlarmManager はあるクラスから開始されますが、AsyncTask は別のクラスにあるため、AlarmManager を開始するクラスは、それが失敗したかどうかを認識しません。
そう?複数のクラスが と通信できAlarmManager
ます。AsyncTask
また、コンストラクターを介してサブクラスにデータを自由に渡してください。
また、 と ではなく を使用することを検討することもできIntentService
ます。バックグラウンドスレッドを自動的に提供します。さらに、これ以上行うべき作業がなくなるとシャットダウンします。これも重要です。そのため、常に実行しているサービスについて不平を言う市場での 1 つ星の評価がたくさん得られることはありません。Service
AsyncTask
IntentService
Service クラスの onPostExecute() から AlarmManager を開始したくありません。
なぜだめですか?
Service 内から AlarmManager を開始すると、それ自体から Service を呼び出す繰り返し関数を作成することになります。
もちろん。それがあなたが望むものです。が実際に話しているのが かService
かかは問題ではありません。を再スケジュールしているコンポーネントはそのものです。AsyncTask
MyOtherReallyCoolClass
AlarmManager
Service
Service