البرمجة غير المتزامنة في Kotlin: دليل شامل للمبتدئين
\n\nتتطلب التطبيقات الحديثة بشكل متزايد تنفيذ مهام متعددة في وقت واحد: تحميل البيانات من الشبكة، العمل مع قاعدة البيانات، معالجة إدخال المستخدم. في لغة Kotlin، يتم استخدام البرمجة غير المتزامنة القائمة على الكوروتينات (coroutines) لهذا الغرض. إنها أداة قوية وأنيقة تتيح كتابة كود غير محظور دون استدعاءات معقدة.
\n\nفي هذه المقالة، سنشرح أساسيات البرمجة غير المتزامنة في Kotlin: ما هي الكوروتينات، وكيفية استخدام launch و async و await، بالإضافة إلى التعرف على المرسلين ومعالجة الأخطاء. المادة موجهة للمطورين المبتدئين الذين هم على دراية بأساسيات بناء جملة Kotlin.
ما هي الكوروتينات ولماذا نحتاجها؟
\n\nالكوروتين هو تدفق تنفيذ خفيف الوزن يمكن إيقافه مؤقتًا واستئنافه دون حظر الخيط الرئيسي. على عكس الخيوط التقليدية (threads)، لا ترتبط الكوروتينات بموارد النظام ويمكن تنفيذها في خيط واحد، مع التبديل بينها.
\n\nالمزايا الرئيسية للكوروتينات:
\n- \n
- الخفة — يمكن تشغيل آلاف الكوروتينات دون استهلاك كبير للذاكرة. \n
- الإيقاف المؤقت (suspend) — يمكن للدالة "تجميد" تنفيذها دون حظر الخيط. \n
- التزامن المنظم — تدير الكوروتينات دورة حياتها تلقائيًا. \n
- البساطة — يبدو الكود وكأنه متزامن، دون استدعاءات متداخلة. \n
للعمل مع الكوروتينات، يجب إضافة التبعية في build.gradle.kts:
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 أخرى.
suspend fun fetchUserData(): String {\n delay(1000) // محاكاة تأخير\n return "User data loaded"\n}\n\nالدالة delay() هي نظير Thread.sleep()، ولكن دون حظر الخيط.
launch — تشغيل كوروتين بدون نتيجة
\n\nالمنشئ launch يبدأ كوروتينًا جديدًا لا يعيد نتيجة (يعيد Job). يُستخدم للمهام من نوع "شغّل وانسَ".
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، الخادم) لا حاجة لاستخدامه.
async و await — الحصول على النتيجة
\n\nإذا كان يجب على الكوروتين إعادة نتيجة، يتم استخدام المنشئ async. يعيد كائن Deferred<T>، والذي يمكن الحصول على القيمة منه باستخدام await().
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 يمكن تشغيل عدة مهام متوازية:
المدونات
توصيات الكتب
اقرأ أيضًا