viewModelScope وDispatchers
نفّذ العمل في مؤشر الترابط المناسب
viewModelScope وDispatchers درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
النطاقات المراعية لدورة الحياة
يوفر Android نطاقات مضمّنة تُلغى تلقائياً:
viewModelScope— يُلغى عند التخلص من ViewModel.lifecycleScope— مرتبط بدورة حياة Activity/Fragment.
استخدام viewModelScope
أطلق عمليات البيانات في viewModelScope. عند التخلص من ViewModel، تُلغى coroutine نيابةً عنك — من دون حاجة إلى تنظيف يدوي.
class UserViewModel(
private val repo: UserRepository
) : ViewModel() {
fun load() {
viewModelScope.launch {
val users = repo.getUsers()
_uiState.value = UiState(users)
}
}
}لماذا لا نستخدم GlobalScope
تجنب GlobalScope؛ إذ تعيش Coroutines التابعة له طوال مدة تشغيل التطبيق ولا ترتبط أبداً بدورة حياة، ما قد يؤدي إلى تسريبات واستمرار العمل بعد اختفاء الشاشة.
ما هي Dispatchers؟
يحدد Dispatcher الخيط (أو مجموعة الخيوط) الذي تعمل عليه coroutine. ويساعد اختيار Dispatcher المناسب على إبقاء الخيط الرئيسي متاحاً.
Dispatchers القياسية
Dispatchers.Main— خيط واجهة المستخدم.Dispatchers.IO— لعمليات الإدخال والإخراج عبر الشبكة والقرص.Dispatchers.Default— للمهام التي تستهلك المعالج بكثافة.
يستخدم viewModelScope Main افتراضياً
يُطلق viewModelScope العمليات باستخدام Dispatchers.Main. وهذا مناسب لتحديث الحالة، لكن ينبغي نقل العمل المكثف بعيداً عنه.
التبديل باستخدام withContext
استخدم withContext لتشغيل كتلة من التعليمات باستخدام Dispatcher مختلف، ثم العودة إلى المستدعي.
suspend fun loadFile(): String =
withContext(Dispatchers.IO) {
File("data.txt").readText()
}الدوال الآمنة على الخيط الرئيسي
تكون الدالة آمنة على الخيط الرئيسي إذا كان استدعاؤها من الخيط الرئيسي آمناً لأنها تجري التبديل داخلياً. وينبغي أن تكون المستودعات آمنة على الخيط الرئيسي حتى لا يضطر المستدعون إلى القلق بشأن الخيوط.
class Repo {
suspend fun getUsers() =
withContext(Dispatchers.IO) { dao.getAll() }
}Room وRetrofit آمنان على الخيط الرئيسي
خبر سار: تعمل أساليب DAO من نوع suspend في Room واستدعاءات Retrofit من نوع suspend بعيداً عن الخيط الرئيسي بالفعل. وعادةً لا تحتاج إلى استخدام withContext صراحةً معهما.
العمل الذي يستهلك المعالج باستخدام Default
للحسابات المكثفة، مثل فرز قائمة ضخمة أو تحليلها، استخدم Dispatchers.Default لتجنب تقطّع واجهة المستخدم.
val sorted = withContext(Dispatchers.Default) {
bigList.sortedBy { it.score }
}حقن Dispatchers
لضمان قابلية الاختبار، احقن Dispatchers بدلاً من تثبيتها في التعليمات البرمجية. ويسمح ذلك للاختبارات باستبدالها بـ Dispatcher مخصص للاختبار.
class Repo(
private val io: CoroutineDispatcher = Dispatchers.IO
) {
suspend fun load() = withContext(io) { /* ... */ }
}تحقق سريع
اختبر مدى فهمك للنطاقات وDispatchers.
مراجعة
لقد تعلمت ما يلي:
- يلغي
viewModelScopeCoroutines عند التخلص من ViewModel. - تجنب
GlobalScope. - اختر Dispatcher المناسب: Main (واجهة المستخدم)، وIO (الشبكة/القرص)، وDefault (المعالج).
- يبدّل
withContextبين الخيوط؛ واستهدف كتابة دوال آمنة على الخيط الرئيسي.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 36
- الدروس
- 152
الأسئلة الشائعة
هل درس «viewModelScope وDispatchers» مجاني؟
نعم — نص درس «viewModelScope وDispatchers» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «viewModelScope وDispatchers»؟
نفّذ العمل في مؤشر الترابط المناسب تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «viewModelScope وDispatchers»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أساسيات Coroutine ونطاقاتها
- viewModelScope وDispatchers
- أساسيات Kotlin Flow
- StateFlow وSharedFlow