كيفية تشغيل إعادة المحاولة عند فشل التنزيل في Asynctask باستخدام AlarmManager

StackOverflow https://stackoverflow.com/questions/3693672

سؤال

أنا استخدم AlarmManager لتشغيل خدمة تحاول تنزيل ملف من الويب. إذا فشل ذلك ، فأنا أرغب في إعادة محاولة هذه الخدمة في 5 دقائق.

داخل الخدمة أقوم بتشغيل AsyncTask لتشغيل الكود الخاص بي. بقدر ما أعرف الطريقة الوحيدة التي يمكنني معرفة ما إذا كانت فشلت أم لا من onPostExecute().

ما هي أفضل طريقة لتنفيذ إعادة محاولة لتلك الخدمة مرة أخرى؟

هل كانت مفيدة؟

المحلول

إجابة Falmarri هي الإجابة الصحيحة ، وأنا لا أفهم مخاوفك.

في onPostExecute(), ، عندما تحدد أن الأمور سارت على ما يرام:

  1. مكالمة getSystemService(ALARM_SERVICE) للحصول على AlarmManager
  2. مكالمة 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 بحد ذاتها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top