كيفية تشغيل إعادة المحاولة عند فشل التنزيل في Asynctask باستخدام AlarmManager
-
02-10-2019 - |
سؤال
أنا استخدم AlarmManager
لتشغيل خدمة تحاول تنزيل ملف من الويب. إذا فشل ذلك ، فأنا أرغب في إعادة محاولة هذه الخدمة في 5 دقائق.
داخل الخدمة أقوم بتشغيل AsyncTask
لتشغيل الكود الخاص بي. بقدر ما أعرف الطريقة الوحيدة التي يمكنني معرفة ما إذا كانت فشلت أم لا من onPostExecute()
.
ما هي أفضل طريقة لتنفيذ إعادة محاولة لتلك الخدمة مرة أخرى؟
المحلول
إجابة Falmarri هي الإجابة الصحيحة ، وأنا لا أفهم مخاوفك.
في onPostExecute()
, ، عندما تحدد أن الأمور سارت على ما يرام:
- مكالمة
getSystemService(ALARM_SERVICE)
للحصول علىAlarmManager
- مكالمة
set()
على الAlarmManager
لتشغيلك في 5 دقائق
إذا لزم الأمر ، استخدم الإضافات على Intent
في ال PendingIntent
لإعطائك معلومات حول ما الذي يجب إعادة محاولته ، أو استخدام سلسلة عمل مخصصة لتمييز إعادة المحاكاة عن الإنذار المجدول ، أو شيء من هذا القبيل. لاحظ أنه إذا كنت تستخدم Intent
إضافات ، ستحتاج إلى اختيار علامة مناسبة مع PendingIntent
(على سبيل المثال ، FLAG_UPDATE_CURRENT
).
تكمن المشكلة في بدء تشغيل AlarmManager من فصل واحد ، لكن Asynctask موجود في فصل آخر ، وبالتالي فإن الفصل الذي يبدأ جهاز الإنذار لا يعرف ما إذا كان قد فشل أم لا.
لذا؟ يمكن لفصول متعددة التحدث إلى AlarmManager
. أيضا ، لا تتردد في تمرير البيانات إلى الخاص بك AsyncTask
الفئة الفرعية عبر مُنشئها.
أيضا ، قد ترغب في التفكير في استخدام IntentService
بدلا من Service
و AsyncTask
. IntentService
يمنحك موضوع خلفية تلقائيًا. بالإضافة إلى ذلك ، يتم إيقاف تشغيله عندما لا يكون هناك المزيد من العمل الذي يتعين القيام به ، وهو أمر مهم أيضًا ، لذلك لا تحصل على مجموعة من تقييمات النجوم الواحدة في السوق التي تشكو من الخدمة التي تستمر في تشغيلها طوال الوقت.
لا أريد أن أبدأ أحد المنبهات من onpostexecute () من فصل الخدمة الخاص بي.
لما لا؟
إذا بدأت جهاز تنبيه من داخل الخدمة ، فأنا نوعًا ما من إنشاء وظيفة متكررة حيث أتصل بالخدمة من نفسها.
بالطبع. هذا ما تريده. لا يهم ما إذا كان Service
أو ال AsyncTask
أو ال MyOtherReallyCoolClass
هو الذي يتحدث بالفعل AlarmManager
- المكون الذي يعيد جدولة Service
هل Service
بحد ذاتها.