استخدام الـ Firebase JobDispatcher
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
في الدرس السابق تعلمنا انشاء وجدولة المهام والاعمال بإستخدام الـ Android JobScheduler ولكنه للإسف لايدعم جميع الـ API (الهواتف القديمة) لذلك في هذا الدرس سنقوم بإستخدام الـ Firebase JobDispatcher فهو مشابه له تماماً ولكن يمتاز بالسهولة والمرونة والدعم الكبير.
الـ Firebase JobDispatcher يعتبر افضل من الـ Android JobSchedualer بكثير. فهو يدعم مميزات وهواتف اكثر. ولكن الان ينصح بإستخدام الـ WorkManager (سنقوم بالتطرق له في الدرس القادم) من حزمة الـ JetPack كما جاء شرح بعض مكوناتها في الدورة: Android Architecture Components.
نقاط يجب عليك مراعاتها
- الـ JobDispatcher مبني على الـ Service و الـ JobSchedualer. اي معرفتك بالدروس السابقه سيكون هذا الدرس سهلاً لك.
- يحتاج الـ JobDispatcher الى وجود Google Play services مثبت على جهاز المستخدم ليعمل.
- نظام الاندرويد هو المتحكم في دقة وقت التشغيل, انت تستطيع فقط تحديد نافذة زمنية.
- يعمل في الخيط الحاسوبي الرئيسي, لذلك من الافضل استخدام احد انماط التصميم للخيوط الحاسوبية (كما جاء في الدروس السابقه) عند اجراء مهمة ثقيله.
رابط المكتبة على الـ GitHub
Firebase JobDispatcher Android.
خطوات انشاء الـ JobDispatcher
- بما انه مكتبه خارجية سنحتاج الى اضافة الـ Dependencies له في ملف الـ Gradle.
- ننشئ كلاس جديدة تعمل extends للـ JobService.
- اظافته الى ملف الـ manifest.xml.
الخطوات:
اضافة مكتبة الـ Firebase JobDispatcher الى الـ الـ Dependencies له في ملف الـ Gradle:
implementation 'com.firebase:firebase-jobdispatcher:0.8.5'
انشاء كلاس للـ الـ Firebase JobDispatcher:
public class MyJobDispatcher extends JobService {
@Override
public boolean onStartJob(final JobParameters job) {
AppExecutor.getInstance().diskIO().execute(new Runnable() {
@Override
public void run() {
// Our code goes here
// Our code goes here
// Our code goes here
jobFinished(job, false);
}
});
return true;
}
@Override
public boolean onStopJob(JobParameters job) {
return false;
}
}
لاحظ التالي:
- دالة الـ onStartJob ودالة onStopJob مشابهه تماماً لما جاء شرحه في الدرس السابق: استخدام الـ Android JobSchedualer.
- لاحظ اننا قمنا بإستخدام نمط الـ ThreadPools (بعكس الدرس السابق قمنا بإستخدام نمط الـ ThreadHandler و الـ AsyncTask) كما جاء في الدرس السابق: استخدام نمط الـ Thread Pools كـ Singleton.
مشابه للسابق اليس كذلك, الفرق الذي يجب عليك الانتباه له هو استخدام مكونات الـ Firebase عندما تعمل import:
import com.firebase.jobdispatcher.JobParameters; import com.firebase.jobdispatcher.JobService;
اضافته الى ملف الـ manifest.xml:
<service android:name=".task.MyJobDispatcher"
android:exported="false">
<intent-filter>
<action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
</intent-filter>
</service>
نحتاج الى اضافته الى ملف الـ Manifest.xml لإنه عباره عن Service مثل ماجاء في دروسها, مع فرق بسيط كما هو ملاحظ.
تجهيز العمل للـ JobDispatcher
والان بعد ان قمنا بإنشاء كلاس خاصة بنا للـ JobDispatcher نحتاج الى انشاء بيانات العمل (في الـ Activity او بإي مكان اخر) ومتى نريده ان يبدأ وكل هذا باستخدام كلاس الـ Job (مشابهه لخطوات الدرس السابق) كالتالي.
انتبه الى الـ import:
import com.firebase.jobdispatcher.Constraint; import com.firebase.jobdispatcher.FirebaseJobDispatcher; import com.firebase.jobdispatcher.GooglePlayDriver; import com.firebase.jobdispatcher.Job; import com.firebase.jobdispatcher.Lifetime; import com.firebase.jobdispatcher.Trigger;
عمل حقل تحديد هل تم جدولة عملنا ام لا, كالتالي:
private static boolean sIsJobDispatcherInitialized;
نعمل دالة وظيفتها بناء العمل وجدولته كالتالي:
private void firebaseJobDispatcher(){
if (sIsJobDispatcherInitialized) {
return;
}
٫٫٫
٫٫
لاحظ التالي:
- لاحظ اذا تم انشاء العمل مسبقاً ستقوم الـ return بالخروج من هذه الدالة (حتى لايحصل تكرار لجدولة العمل).
تجهيز عناصر مساعده لتسهيل كتابة الوقت (النافذة الزمنية):
int INTERVAL_MINUTES = 1;
int INTERVAL_SECONDS = (int) (TimeUnit.MINUTES.toSeconds(INTERVAL_MINUTES)) ;
int SYNC_FLEXTIME_SECONDS = INTERVAL_SECONDS;
نحتاج لإنشاء عنصر Driver من نوع GooglePlayDriver لبناء الـ FirebaseJobDispatcher كالتالي:
GooglePlayDriver driver = new GooglePlayDriver(this);
FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);
لاحظ التالي:
- انشئنا عنصر من واجهة الـ Driver (هذه الكلاس تمثل مكون يفهم جدولة وتنفيذ المهام) وقمنا بعمل init له باستخدام الكلاس GooglePlayDriver (عباره عن polymorphism) هذه الـ GooglePlayDriver تستخدم جنباً الى جنب مع الـ Google Play services واحتجنا لها هنا لإن الـ JobDispatcher قائم على دعم جميع الهواتف التي تأتي الـ Google Play services مثبته فيهم (كسوق جوجل بلاي وماشبه ذلك).
نقوم بإنشاء عنصر الـ Job باستخدام العنصر الذي انشئناه سابقاً FirebaseJobDispatcher و تحديد الشروط التي نريدها لتشغيله كالتالي:
Job ourJob = firebaseJobDispatcher.newJobBuilder()
.setService(MyJobDispatcher.class)
.setTag("MY_JOB_TAG")
.setConstraints(Constraint.DEVICE_CHARGING)
.setConstraints(Constraint.DEVICE_IDLE)
.setConstraints(Constraint.ON_ANY_NETWORK)
.setLifetime(Lifetime.FOREVER)
.setRecurring(true)
.setTrigger(
Trigger.executionWindow(
INTERVAL_SECONDS,
INTERVAL_SECONDS + SYNC_FLEXTIME_SECONDS
)
)
.setReplaceCurrent(true)
.build();
لاحظ التالي:
- انشئنا عنصر من كلاس الـ Job وهو الذي سيمثل شرطيات العمل (كما هو الحال مع الـ JobInfo بالدرس السابق).
- من خلال نمط الـ Builder نستطيع بناء هذا الـ Job. اولاً يجب تحديد الكلاس الذي انشئناها باستخدام الدالة setService ثم وضع له Tag باستخدام الدالة setTag (يقوم بعمل مشابهه للـ ID كما في الدرس السابق, وهنا نحتاجه اذا اردنا ان نلغي او نحدث العمل لاحقاً) ومن ثم الشرطيات.
- الـ setConstraints القيود او الشرطيات.
- الـ Constraint.DEVICE_CHARGING نريد من عملنا ان يعمل اذا كان الجهاز في الشاحن.
- الـ Constraint.DEVICE_IDLE نريد من عملنا ان يعمل اذا كان الجهاز في وضع IDLE.
- الـ Constraint.ON_ANY_NETWORK نريد من عملنا ان يعمل اذا كان به اتصال انترنت بإي شبكه.
- الـ setLifetime بها نحدد ان عملنا هذا نريده ان يعمل مدى حياه الهاتف حتى وان اعاد المستخدم التشغيل.
- الـ setRecurring هنا نحدد هل نريد تكرار عملنا ام مره واحده فقط.
- الـ setTrigger ونعطيها نافذة زمنيه من خلال الدالة executionWindow بين الدقيقه والدقيقتين (اي ان عملنا هذا سيتكرر كل دقيقه تقريباً).
- الـ setReplaceCurrent لتحديد اننا نريد تحديدث العمل اذا وجد عمل مشابهه له في الـ Tag.
- اخيراً قمنا ببنائه بإستخدام build.
جدولة العمل مع الـ JobDispatcher
والان بعد ان قمنا بإنشاء كلاس خاصة بنا للـ JobScheduler وايضاً بعد قيامنا بتجهيز العمل يجب علينا جدولة العمل كخطوة نهائية كالتالي:
firebaseJobDispatcher.schedule(ourJob);
لتصبح الدالة كاملة بالشكل التالي:
private void firebaseJobDispatcher(){
if (sIsJobDispatcherInitialized) {
return;
}
int INTERVAL_MINUTES = 1;
int INTERVAL_SECONDS = (int) (TimeUnit.MINUTES.toSeconds(INTERVAL_MINUTES)) ;
int SYNC_FLEXTIME_SECONDS = INTERVAL_SECONDS;
GooglePlayDriver driver = new GooglePlayDriver(this);
FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);
Job ourJob = firebaseJobDispatcher.newJobBuilder()
.setService(MyJobDispatcher.class)
.setTag("MY_JOB_TAG")
.setConstraints(Constraint.DEVICE_CHARGING)
.setConstraints(Constraint.DEVICE_IDLE)
.setConstraints(Constraint.ON_ANY_NETWORK)
.setLifetime(Lifetime.FOREVER)
.setRecurring(true)
.setTrigger(
Trigger.executionWindow(
INTERVAL_SECONDS,
INTERVAL_SECONDS + SYNC_FLEXTIME_SECONDS
)
)
.setReplaceCurrent(true)
.build();
firebaseJobDispatcher.schedule(ourJob);
sIsJobDispatcherInitialized = true;
}
الغاء العمل
نستطيع الغاء العمل من خلال استخدام الـ Tag كالتالي:
private void cancelFirebaseJobDispatcher(){
GooglePlayDriver driver = new GooglePlayDriver(this);
FirebaseJobDispatcher firebaseJobDispatcher = new FirebaseJobDispatcher(driver);
firebaseJobDispatcher.cancel("MY_JOB_TAG");
}
وهكذا سيكف عملنا عن التشغيل كل دقيقه.
في هذا الدرس تعرفنا على الـ FirebaseJobDispatcher وطريقة انشائه واستخدامه, في الدرس القادم سنتعرف على الـ Work Manager.
رابط الكلاسات المستخدمه في هذا الدرس
- تم استخدام MyJobDispatcher.java في Main8Activity.java.
للحصول على رابط المشروع راجع درس المقدمة.
المصادر والمراجع
للمزيد راجع درس المقدمة.
نهاية الدرس
لاتنسى تتبع الدرس والدورة كذلك لإشعارك عندما يتم التعديل على المتحوى او اضافة المزيد من المعلومات. ايضاً لاتنسى الاعجاب بالدرس ومشاركته مع الاخرين.
محتوى الدورة
الكلمات الدليلية
عن الدرس
0 إعجاب |
2 متابع |
0 مشاركة |
2159 مشاهدات |
منذ 5 سنوات |
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !