أساسيات مدير العمل

الإعلانات

أساسيات مدير العمل

 

 

أساسيات مدير العمل

مع مدير العمل يمكنك بسهولة إعداد مهمة وتسليمها إلى النظام لتعمل ضمن الشروط التي تحددها.

هذه النظرة العامه، تغطي ميزات مدير العمل الأساسية. في هذه الصفحة، ستتعلم كيفية إعداد مهمة وتحديد الشروط التي يجب تشغيلها فيها، وتسليمها إلى النظام.

ستتعلم أيضاً كيفية إعداد المهام التكراريه. للحصول على معلومات حول ميزات مدير العمل WorkManager الأكثر تقدماً، مثل تسلسل المهام وقيم التمرير والإرجاع.

راجع ميزات مدير العمل المتقدمة. هناك العديد من الميزات المتاحة؛ للحصول على التفاصيل الكاملة، راجع الوثائق المرجعية لمدير العمل.

 

ملاحظة: لإستيراد مكتبة مدير العمل إلى مشروع الأندرويد الخاص بك، راجع إضافة مكونات إلى مشروعك.

 

 

 

 

 

الفئات والمفاهيم


تستخدم واجهة برمجة تطبيقات مدير العمل عدة فئات مختلفة. في بعض الحالات، ستحتاج إلى تفريع (جعلها فئة فرعيه) فئة واحدة، من فئات واجهة برمجة التطبيقات.

هذه هي أهم فئات مدير العمل:

– العامل Worker: يحدد المهمة التي تحتاج إلى تنفيذها.

تحتوي واجهات برمجة تطبيقات مدير العمل على فئة Worker مجردة. تقوم أنت بتوسيع هذه الفئه وتقوم بتأدية العمل هنا.

 

– طلب العمل WorkRequest: يمثل مهمة فردية. كحد أدنى، يحدد كائن WorkRequest أي فئة من فئات  Worker يجب أن تقوم بتنفيذ المهمة.

ومع ذلك، يمكنك أيضاً إضافة تفاصيل إلى كائن WorkRequest، مع تحديد أشياء مثل الظروف التي يجب تشغيل المهمة فيها.

لدى كل WorkRequest معرف فريد يتم إنشاؤه تلقائياً؛ يمكنك إستخدام المعرف للقيام بأشياء مثل إلغاء مهمة في قائمة الإنتظار..

أو الحصول على حالة المهمة. WorkRequest عبارة عن فئة مجردة. في الكود الخاص بك، ستستخدم أحد الفئات الفرعية المباشرة..

إما OneTimeWorkRequest أو PeriodicWorkRequest.

 

منشئ طلب العمل WorkRequest.Builder: هو فئة مساعده لإنشاء كائنات WorkRequest.

مجدداً، سوف تستخدم أحد الفئات الفرعية، إما OneTimeWorkRequest.Builder أو PeriodicWorkRequest.Builder.

 

القيود Constraints: تحدد قيوداً على وقت تشغيل المهمة (مثال: “تشغيل المهمه فقط عند الإتصال بالشبكة”).

يمكنك إنشاء كائن “القيود” Constraints بإستخدام Constraints.Builder ثم تمرير قيود إلى WorkRequest.Builder قبل إنشاء WorkRequest.

 

– مدير العمل WorkManager: يقوم بالتضمين في قائمة الإنتظار، و إدارة طلبات العمل.

يمكنك تمرير كائن “طلب العمل” WorkRequest إلى “مدير العمل” WorkManager لوضع المهمة في قائمة الإنتظار.

يقوم “مدير العمل” WorkManager بجدولة المهمة بطريقة تسمح بتوزيع الحمل على موارد النظام، مع مراعاة القيود التي قمت بتحديدها.

 

– معلومات العمل WorkInfo: يحتوي على معلومات حول مهمة معينة.

يقوم مدير العمل بتوفير بيانات مباشرة LiveData لكل كائن “طلب عمل” WorkRequest. البيانات المباشرة LiveData تحمل كائن WorkInfo..

من خلال مراقبة تلك البيانات المباشرة، يمكنك تحديد الحالة الحالية للمهمة، والحصول على أي قيم تم إرجاعها بعد إنتهاء المهمة.

 

 

 

 

سير العمل النموذجي


لنفرض أنك تقوم بإنشاء تطبيق مكتبة صور، ويحتاج هذا التطبيق إلى ضغط الصور المخزنة بشكلٍ دوري.

وترغب في إستخدام واجهات برمجة تطبيقات مدير العمل لجدولة ضغط الصورة.

في هذه الحالة، لا تهتم بشكلٍ خاص بوقت حدوث الضغط؛ فأنت تريد إعداد المهمة ومن ثم نسيانها.

أولاً، ستقوم بتعريف فئة العامل Worker، ومن ثم تقوم بتجاوز دالة ()doWork الخاصة به.

تحدد فئة العامل Worker الخاصة بك، كيفية إجراء العملية، ولكن ليس لديها أي معلومات حول الوقت الذي يجب فيه تشغيل المهمة.

KOTLIN

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.success()

        // (Returning Result.retry() tells WorkManager to try this task again
        // later; Result.failure() says not to try again.)

    }

}

JAVA

public class CompressWorker extends Worker {

    public CompressWorker(
        @NonNull Context context,
        @NonNull WorkerParameters params) {
        super(context, params);
    }

    @Override
    public Result doWork() {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress();

        // Indicate success or failure with your return value:
        return Result.success();

        // (Returning Result.retry() tells WorkManager to try this task again
        // later; Result.failure() says not to try again.)
    }
}

 

بعد ذلك، تقوم بإنشاء كائن OneTimeWorkRequest بناءً على ذلك العامل Worker ، ثم تقوم بوضع المهمة في قائمة الإنتظار بإستخدام WorkManager:

KOTLIN

val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>().build()
WorkManager.getInstance().enqueue(compressionWork)

JAVA

OneTimeWorkRequest compressionWork =
        new OneTimeWorkRequest.Builder(CompressWorker.class)
    .build();
WorkManager.getInstance().enqueue(compressionWork);

 

يختار مدير العمل WorkManager الوقت المناسب لتشغيل المهمة، مما يؤدي إلى موازنة إعتبارات مثل، الحمولة على النظام، وما إذا كان الجهاز موصولاً، وما إلى ذلك.

في معظم الحالات، إذا لم تحدد أية قيود، فسوف يقوم مدير العمل، بتشغيل مهمتك على الفور.

إذا كنت بحاجة إلى التحقق من حالة المهمة، فيمكنك جلب كائن “معلومات العمل” WorkInfo من خلال التعامل مع <LiveData<WorkInfo المناسب.

مثال، إذا كنت تريد التحقق مما إذا كانت المهمة قد أنتهت، فيمكنك إستخدام الكود هكذا:

KOTLIN

WorkManager.getInstance().getWorkInfoByIdLiveData(compressionWork.id)
                .observe(lifecycleOwner, Observer { workInfo ->
                    // Do something with the status
                    if (workInfo != null && workInfo.state.isFinished) {
                        // ...
                    }
                })

JAVA

WorkManager.getInstance().getWorkInfoByIdLiveData(compressionWork.getId())
    .observe(lifecycleOwner, workInfo -> {
        // Do something with the status
        if (workInfo != null && workInfo.getState().isFinished()) {
            // ...
        }
    });

 

لمزيد من المعلومات حول التعامل مع البيانات المباشره LiveData، راجع نظرة عامة على البيانات المباشره LiveData.

 

 

 

 

أساسيات مدير العمل

 

قيود المهمة


لو أردت، يمكنك تحديد قيود على الوقت الذي يجب فيه تشغيل المهمة. مثال، قد ترغب في تحديد، أن المهمة يجب أن تعمل فقط..

عندما يكون الجهاز في وضع السكون، وموصول بالطاقة. في هذه الحالة، ستحتاج إلى إنشاء كائن OneTimeWorkRequest.Builder..

وإستخدام ذلك المنشئ لإنشاء OneTimeWorkRequest الفعليه:

KOTLIN

// Create a Constraints object that defines when the task should run
val myConstraints = Constraints.Builder()
        .setRequiresDeviceIdle(true)
        .setRequiresCharging(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build()

// ...then create a OneTimeWorkRequest that uses those constraints
val compressionWork = OneTimeWorkRequestBuilder<CompressWorker>()
        .setConstraints(myConstraints)
        .build()

JAVA

// Create a Constraints object that defines when the task should run
Constraints myConstraints = new Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
    // Many other constraints are available, see the
    // Constraints.Builder reference
     .build();

// ...then create a OneTimeWorkRequest that uses those constraints
OneTimeWorkRequest compressionWork =
                new OneTimeWorkRequest.Builder(CompressWorker.class)
     .setConstraints(myConstraints)
     .build();

 

ومن ثم تمرير كائن OneTimeWorkRequest الجديد إلى ()WorkManager.enqueue ، كما في السابق.

يأخذ مدير العمل WorkManager القيود الخاصة بك في الإعتبار، عند العثور على وقت لتشغيل المهمة.

 

 

 

إلغاء مهمة


يمكنك إلغاء مهمة بعد تهيئتها. لإلغاء المهمة، تحتاج إلى معرّف العمل الخاص بها، والذي يمكنك الحصول عليه من كائن “طلب العمل” WorkRequest.

مثال، يلغي الكود التالي طلب “ضغط العمل” compressionWork من المقطع السابق:

KOTLIN

val compressionWorkId:UUID = compressionWork.getId()
WorkManager.getInstance().cancelWorkById(compressionWorkId)

JAVA

UUID compressionWorkId = compressionWork.getId();
WorkManager.getInstance().cancelWorkById(compressionWorkId);

 

يبذل مدير العمل WorkManager قصارى جهده لإلغاء المهمة، ولكن هذا غير مؤكد أساساً – قد تكون المهمة قيد التشغيل، أو منتهيه عند محاولتك إلغاؤها.

يوفر مدير العمل WorkManager أيضاً، دوال لإلغاء جميع المهام، في تسلسل عملٍ فريد، أو جميع المهام في وسم محدد، أيضاً على أساس أفضل جهد.

 

 

وسم العمل


يمكنك تجميع المهام الخاصة بك منطقياً، عن طريق تعيين سلسلة وسم، لأي كائن “طلب عمل” WorkRequest.

لتعيين وسم، قم بإستدعاء(WorkRequest.Builder.addTag(Stringمثال:

KOTLIN

val cacheCleanupTask =
        OneTimeWorkRequestBuilder<MyCacheCleanupWorker>()
    .setConstraints(myConstraints)
    .addTag("cleanup")
    .build()

JAVA

OneTimeWorkRequest cacheCleanupTask =
        new OneTimeWorkRequest.Builder(MyCacheCleanupWorker.class)
    .setConstraints(myConstraints)
    .addTag("cleanup")
    .build();

 

توفر فئات مدير العمل WorkManager العديد من دوال المساعدة، التي تتيح لك العمل على جميع المهام بإستخدام وسم معين.

مثال، (WorkManager.cancelAllWorkByTag(String تقوم بإلغاء كافة المهام لوسم معين، وتقوم (WorkManager.getWorkInfosByTagLiveData(String

بإرجاع قائمة بكافة “معلومات العمل” WorkInfo لكافة المهام الموجودة بذلك الوسم.

 

 

 

 

المهام التكراريه


قد تكون لديك مهمة، تحتاج إلى تنفيذها بشكلٍ متكرر. مثال، ربما لا يقوم تطبيق مدير الصور بضغط الصور، كلها معاً مرة واحدة.

الأرجح أنه سيقوم بفحص الصور المشتركة، الخاصة به في كل مرة، ويعرف ما إذا كانت هناك أي صور جديدة، أو متغيرة، تحتاج إلى ضغط.

يمكن لهذه المهمة المتكررة، ضغط الصور التي تعثر عليها، أو بدلاً من ذلك، يمكنها إطلاق مهام “ضغط هذه الصورة” جديدة، بدلاً من العثور على صورة تحتاج إلى ضغط.

لإنشاء مهمة تكراريه، إستخدم الفئة PeriodicWorkRequest.Builder لإنشاء كائن PeriodicWorkRequest..

ثم قم بوضع PeriodicWorkRequest في قائمة الإنتظار، بنفس الطريقة التي تفعلها بكائن OneTimeWorkRequest.

مثال، لنفترض أننا قمنا بتعريف فئة PhotoCheckWorker لتحديد الصور التي تحتاج إلى ضغط.

إذا كنت ترغب في تشغيل مهمة الجرد كل 12 ساعة، فعليك إنشاء كائن PeriodicWorkRequest هكذا:

KOTLIN 

JAVA

PeriodicWorkRequest.Builder photoCheckBuilder =
        new PeriodicWorkRequest.Builder(PhotoCheckWorker.class, 12,
                                        TimeUnit.HOURS);
// ...if you want, you can apply constraints to the builder here...

// Create the actual work object:
PeriodicWorkRequest photoCheckWork = photoCheckBuilder.build();
// Then enqueue the recurring task:
WorkManager.getInstance().enqueue(photoCheckWork);

 

يحاول مدير العمل WorkManager تشغيل مهمتك، في الفترة الزمنية التي طلبتها، مع مراعاة القيود التي فرضتها ومتطلباتها الأخرى.

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات

اترك رد