البرمجة غير المتزامنة في Kotlin: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

البرمجة غير المتزامنة في Kotlin: دليل شامل للمبتدئين

\n\n

تتطلب التطبيقات الحديثة بشكل متزايد تنفيذ مهام متعددة في وقت واحد: تحميل البيانات من الشبكة، العمل مع قاعدة البيانات، معالجة إدخال المستخدم. في لغة Kotlin، يتم استخدام البرمجة غير المتزامنة القائمة على الكوروتينات (coroutines) لهذا الغرض. إنها أداة قوية وأنيقة تتيح كتابة كود غير محظور دون استدعاءات معقدة.

\n\n

في هذه المقالة، سنشرح أساسيات البرمجة غير المتزامنة في Kotlin: ما هي الكوروتينات، وكيفية استخدام launch و async و await، بالإضافة إلى التعرف على المرسلين ومعالجة الأخطاء. المادة موجهة للمطورين المبتدئين الذين هم على دراية بأساسيات بناء جملة Kotlin.

\n\n

ما هي الكوروتينات ولماذا نحتاجها؟

\n\n

الكوروتين هو تدفق تنفيذ خفيف الوزن يمكن إيقافه مؤقتًا واستئنافه دون حظر الخيط الرئيسي. على عكس الخيوط التقليدية (threads)، لا ترتبط الكوروتينات بموارد النظام ويمكن تنفيذها في خيط واحد، مع التبديل بينها.

\n\n

المزايا الرئيسية للكوروتينات:

\n
    \n
  • الخفة — يمكن تشغيل آلاف الكوروتينات دون استهلاك كبير للذاكرة.
  • \n
  • الإيقاف المؤقت (suspend) — يمكن للدالة "تجميد" تنفيذها دون حظر الخيط.
  • \n
  • التزامن المنظم — تدير الكوروتينات دورة حياتها تلقائيًا.
  • \n
  • البساطة — يبدو الكود وكأنه متزامن، دون استدعاءات متداخلة.
  • \n
\n\n

للعمل مع الكوروتينات، يجب إضافة التبعية في build.gradle.kts:

\n\n
dependencies {\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")\n}
\n\n

اللبنات الأساسية: launch و async و suspend

\n\n

دالة suspend

\n\n

أي دالة يمكنها إيقاف تنفيذ الكوروتين مؤقتًا يتم تمييزها بالكلمة المفتاحية suspend. يمكن استدعاء هذه الدوال فقط داخل كوروتين أو دالة suspend أخرى.

\n\n
suspend fun fetchUserData(): String {\n    delay(1000) // محاكاة تأخير\n    return "User data loaded"\n}
\n\n

الدالة delay() هي نظير Thread.sleep()، ولكن دون حظر الخيط.

\n\n

launch — تشغيل كوروتين بدون نتيجة

\n\n

المنشئ launch يبدأ كوروتينًا جديدًا لا يعيد نتيجة (يعيد Job). يُستخدم للمهام من نوع "شغّل وانسَ".

\n\n
import kotlinx.coroutines.*\n\nfun main() = runBlocking {\n    launch {\n        println("تم تشغيل الكوروتين 1")\n        delay(1000)\n        println("اكتمل الكوروتين 1")\n    }\n    println("الخيط الرئيسي يواصل العمل")\n}
\n\n

المخرجات:

\n
الخيط الرئيسي يواصل العمل\nتم تشغيل الكوروتين 1\nاكتمل الكوروتين 1
\n\n

لاحظ: يتم استخدام runBlocking فقط في الأمثلة التعليمية أو في نقاط الدخول (مثل main()). في التطبيقات الحقيقية (Android، الخادم) لا حاجة لاستخدامه.

\n\n

async و await — الحصول على النتيجة

\n\n

إذا كان يجب على الكوروتين إعادة نتيجة، يتم استخدام المنشئ async. يعيد كائن Deferred<T>، والذي يمكن الحصول على القيمة منه باستخدام await().

\n\n
fun main() = runBlocking {\n    val deferredResult: Deferred<String> = async {\n        delay(1500)\n        "نتيجة العمليات الحسابية"\n    }\n\n    println("ننتظر النتيجة...")\n    val result = deferredResult.await()\n    println("تم الحصول على النتيجة: $result")\n}
\n\n

المخرجات:

\n
ننتظر النتيجة...\nتم الحصول على النتيجة: نتيجة العمليات الحسابية
\n\n

باستخدام async يمكن تشغيل عدة مهام متوازية:

\n\n


                
                

المدونات

توصيات الكتب