تكرار السؤال: …
الإجابة المختصرة
هو مبدأ تنظيمي يضمن عدم تسريب أي كوروتين، بحيث تُرتب الكوروتينات في تسلسل هرمي كأبناء لأب لا ينتهي إلا بانتهاء جميع أبنائه، وإذا أُلغي الأب يُلغى كل أبنائه تلقائيًا.
الشرح
يمنع التزامن الهيكلي مشكلة المهام المعلقة التي تعمل في الخلفية وتهدر الذاكرة والبطارية بعد مغادرة المستخدم للشاشة. عندما تنتهي دورة حياة ViewModel (onCleared) أو الـ Activity، يقوم الـ CoroutineScope بإلغاء الـ Parent Job، مما ينشر إشارة الإلغاء فورًا لجميع العمليات والأبناء المتفرعين منها.
مثال بالكود
// coroutineScope يضمن عدم خروج الدالة حتى تكتمل كل المهام الفرعية:
suspend fun processOrder() = coroutineScope {
launch { validateInventory() }
launch { reservePayment() }
// لا تنتهي processOrder إلا بنجاح الاثنين، وإذا فشل أحدهما يلغى الآخر فورًا
}أخطاء شائعة
- استخدام GlobalScope.launch الذي يكسر Structured Concurrency ويعزل الكوروتين عن أي دورة حياة، مسببًا تسريب ذاكرة خطيرًا.