❓ چرا «Coroutines» در دنیای اندروید وجود دارن؟
چون مدیریت تسکهای ناهمگام مثل درخواست شبکه یا دیتابیس، با «Thread»های معمولی کابوسست 🧟
کالبکهای تو در تو (Callback Hell) کد رو غیرقابل نگهداری میکنن 😵💫
«Coroutines» راهکاری سبک و ساختاریافته برای نوشتن کد ناهمگام به سبک ساده و ترتیبی ارائه میدن 🛠️
بدون بلاک کردن رشته اصلی (Main Thread)، میتونید کارهای طولانی رو معلق (Suspend) کنید و بعد ادامه بدید 🧵✨
📌 یک مثال عملی: فرض کنید دیتا از سرور میگیرید و در UI نمایش میدید.
با «Coroutines» این کار بدون هیچ کالبکی انجام میشه:
🧩 این کد چیکار میکنه؟
«launch» یک «Coroutine» جدید میسازه که در «viewModelScope» اجرا میشه.
«withContext(Dispatchers.IO)» عملیات سنگین رو به رشته مخصوص I/O میبره، بدون بلاک کردن Main.
وقتی نتیجه آماده شد، خودکار به رشته اصلی برمیگرده و «updateUI» اجرا میشه.
✅ مزیت اصلی: کد همخون با کدهای ترتیبی معمولی، اما عملکرد همزمان و غیربلاککننده.
بدون نیاز به مدیریت دستی Threadها و کاهش مصرف حافظه.
🚀 این اولین قدم برای تسلط بر برنامهنویسی ناهمگام در کاتلینه.
بقیه مفاهیم مثل «Structured Concurrency» و «Cancellation» رو در بخشهای بعدی میبینیم.
#Codeit #Android #Kotlin #Jetpack #Coroutines #AsyncProgramming #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
چون مدیریت تسکهای ناهمگام مثل درخواست شبکه یا دیتابیس، با «Thread»های معمولی کابوسست 🧟
کالبکهای تو در تو (Callback Hell) کد رو غیرقابل نگهداری میکنن 😵💫
«Coroutines» راهکاری سبک و ساختاریافته برای نوشتن کد ناهمگام به سبک ساده و ترتیبی ارائه میدن 🛠️
بدون بلاک کردن رشته اصلی (Main Thread)، میتونید کارهای طولانی رو معلق (Suspend) کنید و بعد ادامه بدید 🧵✨
📌 یک مثال عملی: فرض کنید دیتا از سرور میگیرید و در UI نمایش میدید.
با «Coroutines» این کار بدون هیچ کالبکی انجام میشه:
fun fetchUserData() {
viewModelScope.launch {
val user = withContext(Dispatchers.IO) { userRepository.getUser() }
// پس از دریافت، به UI برگرد
updateUI(user)
}
}
🧩 این کد چیکار میکنه؟
«launch» یک «Coroutine» جدید میسازه که در «viewModelScope» اجرا میشه.
«withContext(Dispatchers.IO)» عملیات سنگین رو به رشته مخصوص I/O میبره، بدون بلاک کردن Main.
وقتی نتیجه آماده شد، خودکار به رشته اصلی برمیگرده و «updateUI» اجرا میشه.
✅ مزیت اصلی: کد همخون با کدهای ترتیبی معمولی، اما عملکرد همزمان و غیربلاککننده.
بدون نیاز به مدیریت دستی Threadها و کاهش مصرف حافظه.
🚀 این اولین قدم برای تسلط بر برنامهنویسی ناهمگام در کاتلینه.
بقیه مفاهیم مثل «Structured Concurrency» و «Cancellation» رو در بخشهای بعدی میبینیم.
#Codeit #Android #Kotlin #Jetpack #Coroutines #AsyncProgramming #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2
🔹 «suspend function» چطور کدهای async رو به ظاهر sync تبدیل میکنه؟
🔸 اینجا توی بخش دوم «Coroutines» عمیقتر میریم توی مفهوم «suspend function» و جادوی پشتش.
🔹 هر تابعی که با کلیدواژه «suspend» علامتگذاری بشه، میتونه بدون مسدود کردن thread، اجراش رو متوقف کنه و بعداً از همون نقطه ادامه بده.
🔸 مثلاً تصور کن داری از سرور دیتا میگیری؛ توی کد معمولی باید با callback یا «Thread.sleep» منتظر بمونی، اما با «suspend» کدت مثل یه تابع معمولی خونده میشه.
🔹 بیاین یه مثال عملی ببینیم: شبیهسازی درخواست شبکه با تاخیر ۲ ثانیه:
🔸 توی این قطعه، «delay» یه «suspend function» هست که thread رو بلاک نمیکنه، فقط coroutine رو به حالت تعلیق میبره.
🔹 وقتی از «fetchUserData» توی یک «coroutineScope» صدا بزنی، اجراش متوقف میشه و بعد از ۲ ثانیه ادامه پیدا میکنه—هیچ threadای بلاک نمیشه.
🔸 این یعنی میتونی همزمان چندتا درخواست بزنی بدون افت performance.
🔹 نکته پیشرفته: هر «suspend function» در پشت صحنه به یک «continuation» تبدیل میشه که وضعیت اجرا رو ذخیره میکنه.
🔸 برای استفاده درست، همیشه «suspend function» رو فقط از داخل «coroutine» یا «suspend function» دیگه صدا بزن.
🔹 حالا برو کدهات رو با «suspend» بازنویسی کن و از callbackها خداحافظی کن.
#Codeit #Android #Kotlin #Jetpack #Coroutines #SuspendFunctions #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔸 اینجا توی بخش دوم «Coroutines» عمیقتر میریم توی مفهوم «suspend function» و جادوی پشتش.
🔹 هر تابعی که با کلیدواژه «suspend» علامتگذاری بشه، میتونه بدون مسدود کردن thread، اجراش رو متوقف کنه و بعداً از همون نقطه ادامه بده.
🔸 مثلاً تصور کن داری از سرور دیتا میگیری؛ توی کد معمولی باید با callback یا «Thread.sleep» منتظر بمونی، اما با «suspend» کدت مثل یه تابع معمولی خونده میشه.
🔹 بیاین یه مثال عملی ببینیم: شبیهسازی درخواست شبکه با تاخیر ۲ ثانیه:
suspend fun fetchUserData(): String {
delay(2000) // شبیهسازی تاخیر شبکه
return "User: Ali"
}
🔸 توی این قطعه، «delay» یه «suspend function» هست که thread رو بلاک نمیکنه، فقط coroutine رو به حالت تعلیق میبره.
🔹 وقتی از «fetchUserData» توی یک «coroutineScope» صدا بزنی، اجراش متوقف میشه و بعد از ۲ ثانیه ادامه پیدا میکنه—هیچ threadای بلاک نمیشه.
🔸 این یعنی میتونی همزمان چندتا درخواست بزنی بدون افت performance.
🔹 نکته پیشرفته: هر «suspend function» در پشت صحنه به یک «continuation» تبدیل میشه که وضعیت اجرا رو ذخیره میکنه.
🔸 برای استفاده درست، همیشه «suspend function» رو فقط از داخل «coroutine» یا «suspend function» دیگه صدا بزن.
🔹 حالا برو کدهات رو با «suspend» بازنویسی کن و از callbackها خداحافظی کن.
#Codeit #Android #Kotlin #Jetpack #Coroutines #SuspendFunctions #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🚀 Coroutines پیشرفته: «launch» در مقابل «async» – تفاوت واقعی کجاست؟
وقتی توی پروژههای بزرگ اندروید از «Coroutines» استفاده میکنی، دیر یا زود به انتخاب بین «launch» و «async» میرسی. این دو مثل دو برادر دوقلو هستن اما هرکدوم کار خاص خودشون رو دارن. انتخاب اشتباه میتونه کدت رو پیچیده یا حتی باعث باگ بشه. بیا با یه مثال واقعی ببینیم فرقشون چیه.
📌 «launch» برای کارهای یکطرفه (Fire-and-Forget) عالیه: مثلاً ذخیره داده در دیتابیس یا ارسال لاگ، جایی که نیازی به گرفتن نتیجه نداری.
📌 «async» مخصوص کارهایی که باید نتیجه رو برگردونی: مثلاً دریافت اطلاعات از سرور یا پردازش سنگین که بعداً جوابش رو تو رابط کاربری نشون میدی.
🧠 مثال عملی: فرض کن توی یه اپلیکیشن فروشگاهی، هم باید اطلاعات کاربر رو از سرور بگیری (نیاز به نتیجه) و هم یه پیام تبلیغاتی ذخیره کنی (نیاز نیست).
💡 توضیح کد:
- تابع
- تابع
- داخل
🎯 نکته کلیدی:
اگر به نتیجه نیاز داری → «async»
اگر فقط میخوای یه کاری انجام بشه (بدون نیاز به جواب) → «launch»
این انتخاب ساده باعث خوانایی و بهینگی کدت میشه.
#Codeit #Android #Kotlin #Coroutines #launch #async #Jetpack #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی توی پروژههای بزرگ اندروید از «Coroutines» استفاده میکنی، دیر یا زود به انتخاب بین «launch» و «async» میرسی. این دو مثل دو برادر دوقلو هستن اما هرکدوم کار خاص خودشون رو دارن. انتخاب اشتباه میتونه کدت رو پیچیده یا حتی باعث باگ بشه. بیا با یه مثال واقعی ببینیم فرقشون چیه.
📌 «launch» برای کارهای یکطرفه (Fire-and-Forget) عالیه: مثلاً ذخیره داده در دیتابیس یا ارسال لاگ، جایی که نیازی به گرفتن نتیجه نداری.
📌 «async» مخصوص کارهایی که باید نتیجه رو برگردونی: مثلاً دریافت اطلاعات از سرور یا پردازش سنگین که بعداً جوابش رو تو رابط کاربری نشون میدی.
🧠 مثال عملی: فرض کن توی یه اپلیکیشن فروشگاهی، هم باید اطلاعات کاربر رو از سرور بگیری (نیاز به نتیجه) و هم یه پیام تبلیغاتی ذخیره کنی (نیاز نیست).
// نمونه کد با استفاده از launch و async
fun fetchData(): Deferred<String> = viewModelScope.async(Dispatchers.IO) {
delay(2000) // شبیهسازی درخواست شبکه
"دادههای دریافتی از سرور"
}
fun saveLog() {
viewModelScope.launch(Dispatchers.IO) {
delay(500) // ذخیره سریع
println("لاگ ذخیره شد")
}
}
// استفاده در ViewModel
fun loadProfile() {
saveLog() // نیازی به نتیجه نداریم
viewModelScope.launch {
val result = fetchData().await()
// بروزرسانی UI با result
_uiState.value = result
}
}
💡 توضیح کد:
- تابع
fetchData: با «async» کار سنگین شبکه رو انجام میده و یه «Deferred<String>» برمیگردونه. - تابع
saveLog: با «launch» لاگ رو ذخیره میکنه و منتظر هیچ نتیجهای نیست. - داخل
loadProfile: ابتدا لاگ ذخیره میشه (آتش و فراموش). بعد با await() نتیجه رو از «Deferred» میگیریم و UI رو آپدیت میکنیم. 🎯 نکته کلیدی:
اگر به نتیجه نیاز داری → «async»
اگر فقط میخوای یه کاری انجام بشه (بدون نیاز به جواب) → «launch»
این انتخاب ساده باعث خوانایی و بهینگی کدت میشه.
#Codeit #Android #Kotlin #Coroutines #launch #async #Jetpack #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
📱 یادگیری «Android» قرار نیست یک شبه اتفاق بیفته، اما خیلیها وسط راه خسته میشن و ول میکنن. 😓
رازش تو حجم مطالبی نیست که میخونی، بلکه تو مسیری که انتخاب میکنی.
🧠 اول از همه: ذهنتو از «کمالگرایی» خالی کن. قرار نیست همه چیز رو از روز اول بلد باشی.
🎯 فقط یک هدف کوچک برای هر هفته انتخاب کن: مثلاً یادگیری «ViewModel» یا کار با «StateFlow».
📌 قانون ۲۰ دقیقه رو امتحان کن: هر روز فقط ۲۰ دقیقه کد بزن، نه بیشتر. این کار استرس رو کم میکنه و مغزت عادت میکنه.
🔄 وقتی به مشکل میخوری، به جای گشتن توی ده تا منبع، فقط یک منبع معتبر مثل مستندات رسمی «Android Developers» رو باز کن.
👨💻 از پروژههای کوچیک شروع کن: یک «ToDo App» ساده با «Room Database». اونقدر تکرارش کن تا برات عادی بشه.
⏳ یادت باشه: پیشرفت خطی نیست. بعضی هفتهها هیچی یاد نمیگیری، بعضی هفتهها پرواز میکنی. اشکال نداره.
💡 نکته طلایی: برای هر مبحث جدید، اول «چرایی» اون رو بفهم، بعد برو سراغ «چگونگی».
🔥 در نهایت: بزرگترین دشمن تو مقایسه با بقیه است. مسیر خودت رو برو، با سرعت خودت.
📌 خلاصه: برنامه کوچیک، تمرکز بالا، استراحت کافی، و تکرار. همین.
#Codeit #Android #Mindset #Learning #Kotlin #Jetpack #NoStress
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
رازش تو حجم مطالبی نیست که میخونی، بلکه تو مسیری که انتخاب میکنی.
🧠 اول از همه: ذهنتو از «کمالگرایی» خالی کن. قرار نیست همه چیز رو از روز اول بلد باشی.
🎯 فقط یک هدف کوچک برای هر هفته انتخاب کن: مثلاً یادگیری «ViewModel» یا کار با «StateFlow».
📌 قانون ۲۰ دقیقه رو امتحان کن: هر روز فقط ۲۰ دقیقه کد بزن، نه بیشتر. این کار استرس رو کم میکنه و مغزت عادت میکنه.
🔄 وقتی به مشکل میخوری، به جای گشتن توی ده تا منبع، فقط یک منبع معتبر مثل مستندات رسمی «Android Developers» رو باز کن.
👨💻 از پروژههای کوچیک شروع کن: یک «ToDo App» ساده با «Room Database». اونقدر تکرارش کن تا برات عادی بشه.
⏳ یادت باشه: پیشرفت خطی نیست. بعضی هفتهها هیچی یاد نمیگیری، بعضی هفتهها پرواز میکنی. اشکال نداره.
💡 نکته طلایی: برای هر مبحث جدید، اول «چرایی» اون رو بفهم، بعد برو سراغ «چگونگی».
🔥 در نهایت: بزرگترین دشمن تو مقایسه با بقیه است. مسیر خودت رو برو، با سرعت خودت.
📌 خلاصه: برنامه کوچیک، تمرکز بالا، استراحت کافی، و تکرار. همین.
#Codeit #Android #Mindset #Learning #Kotlin #Jetpack #NoStress
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤3
🚀 آیا میدونی چرا بعضی از «Coroutine»ها با وجود خطا، بقیه رو نابود نمیکنن؟
🔧 رازش در انتخاب نوع «CoroutineScope» و «Job» هست!
🧠 «CoroutineScope» مشخص میکنه coroutineها تا کی زنده باشن و چطور لغو بشن.
📦 هر scope یه «Job» داره؛ اگر اون «Job» رو با «SupervisorJob» بسازی، شکست یک coroutine بقیه رو نمیکشه!
💡 مثال کاربردی: توی اندروید، گاهی نیاز به scope اختصاصی داری که lifecycle خودش رو داشته باشه (مثل یک سرویس ساده).
✅ با این scope سفارشی خطاها رو مدیریت کن:
🛠 در این کد، اگر دانلود فایل A با خطا مواجه بشه، دانلود فایل B ادامه پیدا میکنه.
✅ با صدا زدن «cleanup» در زمان مناسب (مثلاً onDestroy)، از نشت حافظه جلوگیری میکنی.
🎯 نکته طلایی: همیشه scopeهای سفارشی رو بعد از اتمام کار لغو کن تا منابع هدر نره!
📌 حالا وقتشه که تو پروژهات از «SupervisorJob» استفاده کنی و خطاهای جزئی رو مدیریت کنی.
#Codeit #Android #Kotlin #Jetpack #Coroutines #CoroutineScope #SupervisorJob
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔧 رازش در انتخاب نوع «CoroutineScope» و «Job» هست!
🧠 «CoroutineScope» مشخص میکنه coroutineها تا کی زنده باشن و چطور لغو بشن.
📦 هر scope یه «Job» داره؛ اگر اون «Job» رو با «SupervisorJob» بسازی، شکست یک coroutine بقیه رو نمیکشه!
💡 مثال کاربردی: توی اندروید، گاهی نیاز به scope اختصاصی داری که lifecycle خودش رو داشته باشه (مثل یک سرویس ساده).
✅ با این scope سفارشی خطاها رو مدیریت کن:
class DataLoader {
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
fun loadData() {
scope.launch { /* دانلود فایل A */ }
scope.launch { /* دانلود فایل B */ }
}
fun cleanup() {
scope.cancel() // همه رو لغو کن
}
}
🛠 در این کد، اگر دانلود فایل A با خطا مواجه بشه، دانلود فایل B ادامه پیدا میکنه.
✅ با صدا زدن «cleanup» در زمان مناسب (مثلاً onDestroy)، از نشت حافظه جلوگیری میکنی.
🎯 نکته طلایی: همیشه scopeهای سفارشی رو بعد از اتمام کار لغو کن تا منابع هدر نره!
📌 حالا وقتشه که تو پروژهات از «SupervisorJob» استفاده کنی و خطاهای جزئی رو مدیریت کنی.
#Codeit #Android #Kotlin #Jetpack #Coroutines #CoroutineScope #SupervisorJob
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
🚀 دیسپچرهای کاتلین رو درست بشناس!
«Dispatcher» مشخص میکند کد شما روی کدام Thread اجرا شود.
سه دیسپچر اصلی داریم: «Main»، «IO» و «Default».
🔄 «Dispatchers.Main» مخصوص UI است (مثلاً در «Jetpack Compose» یا «Android View»).
⚙️ «Dispatchers.Default» برای کارهای سنگین CPU مثل پردازش تصویر یا فیلتر لیست.
💾 «Dispatchers.IO» برای عملیات ورودی/خروجی مثل شبکه یا دیتابیس.
✅ انتخاب درست دیسپچر از ANR و کندی اپ جلوگیری میکند.
با یک مثال عملی میبینیم چطور از «withContext» برای جابهجایی دیسپچر استفاده کنیم:
در این کد «withContext» تابع را به «Dispatchers.IO» منتقل میکند،
بدون این که Thread اصلی Main را بلاک کند.
💡 نکته پیشرفته:
«Dispatchers.Default» از یک Thread Pool با تعداد برابر هستههای CPU استفاده میکند،
اما «Dispatchers.IO» حداکثر تا ۶۴ ترد را مدیریت میکند.
✅ همیشه عملیات شبکه و فایل را داخل «IO» بگذارید و پردازش دادههای سنگین را داخل «Default».
#Codeit #Android #Kotlin #Jetpack #Coroutines #Dispatcher #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«Dispatcher» مشخص میکند کد شما روی کدام Thread اجرا شود.
سه دیسپچر اصلی داریم: «Main»، «IO» و «Default».
🔄 «Dispatchers.Main» مخصوص UI است (مثلاً در «Jetpack Compose» یا «Android View»).
⚙️ «Dispatchers.Default» برای کارهای سنگین CPU مثل پردازش تصویر یا فیلتر لیست.
💾 «Dispatchers.IO» برای عملیات ورودی/خروجی مثل شبکه یا دیتابیس.
✅ انتخاب درست دیسپچر از ANR و کندی اپ جلوگیری میکند.
با یک مثال عملی میبینیم چطور از «withContext» برای جابهجایی دیسپچر استفاده کنیم:
suspend fun fetchUserData(): User {
return withContext(Dispatchers.IO) {
// فراخوانی API یا خواندن از دیتابیس
apiService.getUser() // اجرا روی IO thread
}
}
در این کد «withContext» تابع را به «Dispatchers.IO» منتقل میکند،
بدون این که Thread اصلی Main را بلاک کند.
💡 نکته پیشرفته:
«Dispatchers.Default» از یک Thread Pool با تعداد برابر هستههای CPU استفاده میکند،
اما «Dispatchers.IO» حداکثر تا ۶۴ ترد را مدیریت میکند.
✅ همیشه عملیات شبکه و فایل را داخل «IO» بگذارید و پردازش دادههای سنگین را داخل «Default».
#Codeit #Android #Kotlin #Jetpack #Coroutines #Dispatcher #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
قبل از اینکه عالی باشی، باید خوب باشی.
قبل از اینکه خوب باشی، باید بد باشی.
قبل از اینکه بد باشی، باید شروع کنی.
@CodeitMobile
قبل از اینکه خوب باشی، باید بد باشی.
قبل از اینکه بد باشی، باید شروع کنی.
@CodeitMobile
❤2🔥1
🚀 آیا میدانید مدیریت درست «Job» در «Coroutines» میتواند جان اپلیکیشنتان را نجات دهد؟
در بخش ششم، به عمق «Job» و چرخهی حیات آن میرویم. 🧵
1️⃣ هر «Coroutine» یک «Job» دارد که وضعیت آن را نشان میدهد:
«Active» (در حال اجرا)، «Completed» (تمام شده)، «Cancelled» (لغو شده) یا «Cancelling» (در حال لغو).
2️⃣ «Job»ها رابطهی والد‑فرزندی دارند. لغو والد باعث لغو خودکار تمام فرزندان میشود.
برای جلوگیری از این رفتار از «SupervisorJob» استفاده میکنیم.
3️⃣ مثال عملی: لغو یک «Coroutine» پس از خروج از صفحه با «viewModelScope»:
این کد پس از ۲ ثانیه، عملیات تکرارشونده را متوقف میکند.
4️⃣ اگر نیاز دارید یک «Coroutine» فرزند حتی با لغو والد زنده بماند، از «SupervisorJob» استفاده کنید:
در اینجا خطای فرزند اول باعث لغو والد نمیشود و فرزند دوم ادامه میدهد. ✅
💡 نکته: همیشه «Job»ها را در «lifecycleScope» یا «viewModelScope» مدیریت کنید تا از نشت حافظه جلوگیری شود.
📌 خلاصه: «Job» قلب چرخهی حیات «Coroutines» است؛ با «cancel» و «SupervisorJob» کنترل کامل داشته باشید.
#Codeit #Android #Kotlin #Jetpack #Coroutines #Job #SupervisorJob #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
در بخش ششم، به عمق «Job» و چرخهی حیات آن میرویم. 🧵
1️⃣ هر «Coroutine» یک «Job» دارد که وضعیت آن را نشان میدهد:
«Active» (در حال اجرا)، «Completed» (تمام شده)، «Cancelled» (لغو شده) یا «Cancelling» (در حال لغو).
2️⃣ «Job»ها رابطهی والد‑فرزندی دارند. لغو والد باعث لغو خودکار تمام فرزندان میشود.
برای جلوگیری از این رفتار از «SupervisorJob» استفاده میکنیم.
3️⃣ مثال عملی: لغو یک «Coroutine» پس از خروج از صفحه با «viewModelScope»:
viewModelScope.launch {
val job = launch {
repeat(100) {
delay(500)
Log.d("TAG", "Iteration $it")
}
}
delay(2000)
job.cancel() // لغو دستی
job.join() // منتظر میماند تا کاملاً لغو شود
}
این کد پس از ۲ ثانیه، عملیات تکرارشونده را متوقف میکند.
4️⃣ اگر نیاز دارید یک «Coroutine» فرزند حتی با لغو والد زنده بماند، از «SupervisorJob» استفاده کنید:
val supervisor = SupervisorJob()
val scope = CoroutineScope(supervisor + Dispatchers.Main)
scope.launch {
launch {
delay(1000)
throw RuntimeException("Error!")
}
launch {
delay(2000)
println("I'm still alive!")
}
}
در اینجا خطای فرزند اول باعث لغو والد نمیشود و فرزند دوم ادامه میدهد. ✅
💡 نکته: همیشه «Job»ها را در «lifecycleScope» یا «viewModelScope» مدیریت کنید تا از نشت حافظه جلوگیری شود.
📌 خلاصه: «Job» قلب چرخهی حیات «Coroutines» است؛ با «cancel» و «SupervisorJob» کنترل کامل داشته باشید.
#Codeit #Android #Kotlin #Jetpack #Coroutines #Job #SupervisorJob #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
🔥 اعتمادبهنفس تو مسیر توسعهدهندگی، یه شبه ساخته نمیشه!
خیلی از جونیورها فکر میکنن باید همه چی رو بلد باشن تا اعتمادبهنفس داشته باشن. اما حقیقت اینه که اعتمادبهنفس از تجربه و اشتباهکردن میاد. 🚀
✅ قدم اول: بپذیر که قراره اشتباه کنی. هر اروری که میبینی، یه درس ارزشمنده.
✅ قدم دوم: از پرسیدن سوال نترس. توی تیمهای حرفهای، سوال درستپرسیدن یه مهارته.
✅ قدم سوم: هر روز یه قطعه کد کوچیک بنویس. حتی یه تابع ساده. تکرار باعث تسلط میشه.
✅ قدم چهارم: کدهات رو روی «GitHub» بذار. دیدن پیشرفتهات به مرور زمان، اعتمادبهنفست رو چندبرابر میکنه.
✅ قدم پنجم: با داکیومنتها و پروژههای واقعی کار کن. فرقی نداره پروژهات چقدر کوچیک باشه، هر موفقیت کوچیکی اعتمادتو بالا میبره.
یادت باشه: همه «Senior Developer»ها هم یه روز جونیور بودن. فقط اینقدر به مسیرشون ادامه دادن تا بهش رسیدن. 🎯
هیچوقت خودت رو با بقیه مقایسه نکن. مسیر هر کدوم از ما منحصربهفرده.
#Codeit #Android #Kotlin #Jetpack #JuniorDeveloper #GrowthMindset #DeveloperLife #TechCareer
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
خیلی از جونیورها فکر میکنن باید همه چی رو بلد باشن تا اعتمادبهنفس داشته باشن. اما حقیقت اینه که اعتمادبهنفس از تجربه و اشتباهکردن میاد. 🚀
✅ قدم اول: بپذیر که قراره اشتباه کنی. هر اروری که میبینی، یه درس ارزشمنده.
✅ قدم دوم: از پرسیدن سوال نترس. توی تیمهای حرفهای، سوال درستپرسیدن یه مهارته.
✅ قدم سوم: هر روز یه قطعه کد کوچیک بنویس. حتی یه تابع ساده. تکرار باعث تسلط میشه.
✅ قدم چهارم: کدهات رو روی «GitHub» بذار. دیدن پیشرفتهات به مرور زمان، اعتمادبهنفست رو چندبرابر میکنه.
✅ قدم پنجم: با داکیومنتها و پروژههای واقعی کار کن. فرقی نداره پروژهات چقدر کوچیک باشه، هر موفقیت کوچیکی اعتمادتو بالا میبره.
یادت باشه: همه «Senior Developer»ها هم یه روز جونیور بودن. فقط اینقدر به مسیرشون ادامه دادن تا بهش رسیدن. 🎯
هیچوقت خودت رو با بقیه مقایسه نکن. مسیر هر کدوم از ما منحصربهفرده.
#Codeit #Android #Kotlin #Jetpack #JuniorDeveloper #GrowthMindset #DeveloperLife #TechCareer
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
🚨 همیشه یک خطای کوچک کل پروژه رو خراب میکنه؟
اگه با «Coroutines» کار کرده باشی، میدونی که شکست یک فرزند توی «Job» عادی میتونه کل «Scope» رو نابود کنه. 😰
اما «SupervisorJob» دقیقاً برای همین ساخته شده؛ بهش بگو: «این کارها مستقلان، اگه یکی افتاد بقیه ادامه بدن.»
کاربرد واقعی: وقتی چند تا «Network Request» موازی داری و یکی خطا میده، بقیه نباید کنسل بشن. مثلاً دانلود سه عکس جداگانه. 🖼️
حالا ببینیم کدش چطوریه. سنگین ولی ساده:
توی کد بالا فرزند اول خطا میده ولی فرزند دوم بدون مشکل ادامه میده و تموم میشه. اگه از «Job» معمولی استفاده میکردی، فرزند دوم هم کنسل میشد. 🤝
نکته مهم: برای «ViewModel» هم میتونی از «SupervisorJob» استفاده کنی تا خطای یکی از تسکها بقیه رو نکشه. فقط یادت باشه مدیریت خطا رو جدی بگیری. 🧠
در نهایت: وقتی کارهای موازی مستقل داری، «SupervisorJob» انتخاب درسته. ✌️
#Codeit #Android #Kotlin #Jetpack #Coroutines #SupervisorJob #KotlinFlow #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
اگه با «Coroutines» کار کرده باشی، میدونی که شکست یک فرزند توی «Job» عادی میتونه کل «Scope» رو نابود کنه. 😰
اما «SupervisorJob» دقیقاً برای همین ساخته شده؛ بهش بگو: «این کارها مستقلان، اگه یکی افتاد بقیه ادامه بدن.»
کاربرد واقعی: وقتی چند تا «Network Request» موازی داری و یکی خطا میده، بقیه نباید کنسل بشن. مثلاً دانلود سه عکس جداگانه. 🖼️
حالا ببینیم کدش چطوریه. سنگین ولی ساده:
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
delay(100)
throw RuntimeException("child 1 failed")
}
scope.launch {
delay(200)
println("child 2 finished successfully")
}
توی کد بالا فرزند اول خطا میده ولی فرزند دوم بدون مشکل ادامه میده و تموم میشه. اگه از «Job» معمولی استفاده میکردی، فرزند دوم هم کنسل میشد. 🤝
نکته مهم: برای «ViewModel» هم میتونی از «SupervisorJob» استفاده کنی تا خطای یکی از تسکها بقیه رو نکشه. فقط یادت باشه مدیریت خطا رو جدی بگیری. 🧠
در نهایت: وقتی کارهای موازی مستقل داری، «SupervisorJob» انتخاب درسته. ✌️
#Codeit #Android #Kotlin #Jetpack #Coroutines #SupervisorJob #KotlinFlow #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥3
«Coroutines» بخش ۸؛ این بار سراغ یکی از پیچیدهترین مباحث رفتیم: مدیریت خطا! 🧯
وقتی یک «Coroutine» خطا بدهد، رفتارش با «try/catch» معمولی فرق دارد؛ خطا میتونه کل ساختار والد رو از بین ببره! 💥
مثال: یک «ViewModel» چند «Coroutine» موازی داره؛ اگر یکی خطا بده، بقیه هم باید ادامه بدن. 🧩
برای همین به «SupervisorJob» نیاز داریم تا خطای هر فرزند جداگانه مدیریت بشه. 🔧
کد زیر رو ببینید:
اینجا «SupervisorJob» باعث میشه خطای فرزند اول، فرزند دوم رو از بین نبره. 📝
نکته مهم: «CoroutineExceptionHandler» هم برای گرفتن خطاهای نهایی و لاگکردنشون استفاده میشه. ⚠️
پس برای کارهای مستقل از «SupervisorJob» و برای کارهای وابسته از «Job» معمولی استفاده کنید. 🚀
«Codeit» رو دنبال کنید تا بخشهای بعدی رو از دست ندید! 📚
#Codeit #Android #Kotlin #Jetpack #Coroutines #Programming #KotlinFlow
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی یک «Coroutine» خطا بدهد، رفتارش با «try/catch» معمولی فرق دارد؛ خطا میتونه کل ساختار والد رو از بین ببره! 💥
مثال: یک «ViewModel» چند «Coroutine» موازی داره؛ اگر یکی خطا بده، بقیه هم باید ادامه بدن. 🧩
برای همین به «SupervisorJob» نیاز داریم تا خطای هر فرزند جداگانه مدیریت بشه. 🔧
کد زیر رو ببینید:
val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
scope.launch {
delay(100)
throw RuntimeException("خطا در فرزند اول")
}
scope.launch {
delay(300)
println("فرزند دوم هنوز فعال است")
}
اینجا «SupervisorJob» باعث میشه خطای فرزند اول، فرزند دوم رو از بین نبره. 📝
نکته مهم: «CoroutineExceptionHandler» هم برای گرفتن خطاهای نهایی و لاگکردنشون استفاده میشه. ⚠️
پس برای کارهای مستقل از «SupervisorJob» و برای کارهای وابسته از «Job» معمولی استفاده کنید. 🚀
«Codeit» رو دنبال کنید تا بخشهای بعدی رو از دست ندید! 📚
#Codeit #Android #Kotlin #Jetpack #Coroutines #Programming #KotlinFlow
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
راستش رو بخوای، «Cancellation» توی «Coroutines» برخلاف تصور اکثرا، یه مکانیزم همکارانهست نه اجبار! 🎯
وقتی یه «Coroutine» رو لغو میکنی، فوراً متوقف نمیشه؛ فقط یه «CancellationException» میگیره و باید خودش همکاری کنه تا تموم شه. 🤝
اگه کدت به این موضوع اهمیت نده، کارهای سنگین بعد از خروج از صفحه هم ادامه پیدا میکنن و منابع رو میبلعن! 🔥📱
توی «Android» با «viewModelScope» این کار خودکاره، ولی توی «Coroutine»های شخصیسازیشده باید خودت مدیریت کنی. 💡
توابعی مثل «delay» و «withContext» خودشون قابل «Cancellation» هستن؛ ولی کدهای سنگین مثل حلقهی پردازش تصویر، هیچ واکنشی نشون نمیدن. 😬
برای همین توی حلقهها از «ensureActive» یا بررسی «isActive» استفاده میکنیم. 🧠
یه مثال پیشرفته از همکاری حرفهای:
«ensureActive» مطمئن میشه هر مرحله قبل از ادامه، وضعیتش رو چک کنه؛ بعد توی «catch» با «NonCancellable» کارهای تمیزکاری مثل بستن «File» یا «Database» رو انجام میدیم.
دقت کن «CancellationException» رو همیشه دوباره «throw» کن و هرگز قورتش نده؛ وگرنه کار ادامه پیدا میکنه! 🚨
جمعبندی: بعد از «cancel» حتماً «join» هم صدا بزن تا مطمئن شی واقعاً تموم شده. ✅
با این الگو، دیگه نگران «Memory Leak» و حافظهی هدررفته نخواهی بود. 🚀
#Codeit #Android #Kotlin #Jetpack #Coroutines #Cancellation #KotlinAdvanced #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی یه «Coroutine» رو لغو میکنی، فوراً متوقف نمیشه؛ فقط یه «CancellationException» میگیره و باید خودش همکاری کنه تا تموم شه. 🤝
اگه کدت به این موضوع اهمیت نده، کارهای سنگین بعد از خروج از صفحه هم ادامه پیدا میکنن و منابع رو میبلعن! 🔥📱
توی «Android» با «viewModelScope» این کار خودکاره، ولی توی «Coroutine»های شخصیسازیشده باید خودت مدیریت کنی. 💡
توابعی مثل «delay» و «withContext» خودشون قابل «Cancellation» هستن؛ ولی کدهای سنگین مثل حلقهی پردازش تصویر، هیچ واکنشی نشون نمیدن. 😬
برای همین توی حلقهها از «ensureActive» یا بررسی «isActive» استفاده میکنیم. 🧠
یه مثال پیشرفته از همکاری حرفهای:
val scope = CoroutineScope(Dispatchers.Default)
val job = scope.launch {
try {
repeat(1000) { index ->
ensureActive()
saveBitmapToCache(index)
}
} catch (e: CancellationException) {
withContext(NonCancellable) {
clearCache()
}
throw e
}
}
job.cancel()
job.join()
«ensureActive» مطمئن میشه هر مرحله قبل از ادامه، وضعیتش رو چک کنه؛ بعد توی «catch» با «NonCancellable» کارهای تمیزکاری مثل بستن «File» یا «Database» رو انجام میدیم.
دقت کن «CancellationException» رو همیشه دوباره «throw» کن و هرگز قورتش نده؛ وگرنه کار ادامه پیدا میکنه! 🚨
جمعبندی: بعد از «cancel» حتماً «join» هم صدا بزن تا مطمئن شی واقعاً تموم شده. ✅
با این الگو، دیگه نگران «Memory Leak» و حافظهی هدررفته نخواهی بود. 🚀
#Codeit #Android #Kotlin #Jetpack #Coroutines #Cancellation #KotlinAdvanced #Programming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🧠 «Problem Solving» فقط یک مهارت برنامهنویسی نیست؛ یک طرز فکر است که با تمرین ساخته میشود.
خیلی وقتها راهحل مشکل جلوی چشمات است، اما چون روش درستی نداری، نمیبینیش.
سادهترین راه برای حل هر مسئله، «Divide and Conquer» است؛ یعنی مسئله را به بخشهای کوچکتر تقسیم کن.
بیایید با یک مثال واقعی ببینیم: فرض کن باید بزرگترین عدد یک لیست را پیدا کنی. 🧮
به جای یک تابع پیچیده، مسئله را به سه قدم کوچک تقسیم میکنیم:
کد این کار را ببین:
اول بررسی میکند لیست خالی نباشد، بعد اولین عنصر را بهعنوان بزرگترین در نظر میگیرد و در حلقه بقیه را مقایسه میکند. ✅
همین الگو را در «Kotlin» و «Jetpack Compose» هم به کار ببر: «UI» را به کامپوننتهای کوچک تقسیم کن، منطق را جدا کن و دادهها را ساده نگه دار.
دفعه بعد که به مشکل بزرگی رسیدی، اول بنویس مسئله دقیقاً چیست و خروجی مطلوبت کدام است.
بعد گامهای کوچک را مشخص کن و یکییکی پیادهسازی کن. همین! 🚀
«Problem Solving» با انجام چالشهای کوچک روزانه تقویت میشود؛ هر روز یک مسئله کوچک حل کن.
یادت باشد: هر برنامهنویس حرفهای، روزی مبتدی بوده است. 🌱
#Codeit #Android #Kotlin #Jetpack #ProblemSolving #Mindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
خیلی وقتها راهحل مشکل جلوی چشمات است، اما چون روش درستی نداری، نمیبینیش.
سادهترین راه برای حل هر مسئله، «Divide and Conquer» است؛ یعنی مسئله را به بخشهای کوچکتر تقسیم کن.
بیایید با یک مثال واقعی ببینیم: فرض کن باید بزرگترین عدد یک لیست را پیدا کنی. 🧮
به جای یک تابع پیچیده، مسئله را به سه قدم کوچک تقسیم میکنیم:
کد این کار را ببین:
fun findMax(numbers: List<Int>): Int? {
if (numbers.isEmpty()) return null
var max = numbers[0]
for (number in numbers) {
if (number > max) max = number
}
return max
}
اول بررسی میکند لیست خالی نباشد، بعد اولین عنصر را بهعنوان بزرگترین در نظر میگیرد و در حلقه بقیه را مقایسه میکند. ✅
همین الگو را در «Kotlin» و «Jetpack Compose» هم به کار ببر: «UI» را به کامپوننتهای کوچک تقسیم کن، منطق را جدا کن و دادهها را ساده نگه دار.
دفعه بعد که به مشکل بزرگی رسیدی، اول بنویس مسئله دقیقاً چیست و خروجی مطلوبت کدام است.
بعد گامهای کوچک را مشخص کن و یکییکی پیادهسازی کن. همین! 🚀
«Problem Solving» با انجام چالشهای کوچک روزانه تقویت میشود؛ هر روز یک مسئله کوچک حل کن.
یادت باشد: هر برنامهنویس حرفهای، روزی مبتدی بوده است. 🌱
#Codeit #Android #Kotlin #Jetpack #ProblemSolving #Mindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🧵 «Coroutines» قسمت دهم: «Cooperative Cancellation» — لغوِ همکارانه!
شاید فکر کنی با «cancel» کروتین همینجا میمیره؛ ولی نه! 😅
کروتین فقط سر یه «suspension point» اجازه میده کارش رو لغو کنن. 🤝
یعنی اگه توی یه حلقه سنگین باشی و جایی «suspend» نداشته باشه، کنسل شدن رو نمیبینه! ⚠️
مثال واقعی: کاربر از صفحه خارج شده ولی کروتین هنوز مشغول پردازش عکسه. 📸
اگه «cooperative» نباشه، کار ادامه پیدا میکنه و باتری هدر میره! 🔋
راهحل: از «isActive» یا «ensureActive» استفاده کن.
یه نمونه ساده ببین:
اینجا «ensureActive» بعد از هر مرحله چک میکنه؛ اگه کروتین «cancel» شده باشه، «CancellationException» پرتاب میشه و تمیز خارج میشه. ✅
«delay» و «withContext» خودشون «cancellable» هستن، ولی کار «CPU-Intensive» رو حتماً خودت چک کن! 💡
نکته حرفهای: برای پاکسازی منابع، از «finally» یا «invokeOnCompletion» استفاده کن. 🧹
جمعبندی: لغو در کروتینها وظیفهی خودته؛ پس همیشه همکاری کن! 🎯
#Codeit #Android #Kotlin #Jetpack #Coroutines #Cancellation #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
شاید فکر کنی با «cancel» کروتین همینجا میمیره؛ ولی نه! 😅
کروتین فقط سر یه «suspension point» اجازه میده کارش رو لغو کنن. 🤝
یعنی اگه توی یه حلقه سنگین باشی و جایی «suspend» نداشته باشه، کنسل شدن رو نمیبینه! ⚠️
مثال واقعی: کاربر از صفحه خارج شده ولی کروتین هنوز مشغول پردازش عکسه. 📸
اگه «cooperative» نباشه، کار ادامه پیدا میکنه و باتری هدر میره! 🔋
راهحل: از «isActive» یا «ensureActive» استفاده کن.
یه نمونه ساده ببین:
val job = CoroutineScope(Dispatchers.Default).launch {
repeat(10) { index ->
ensureActive()
Thread.sleep(500)
println("Processing $index")
}
}
job.cancel()
اینجا «ensureActive» بعد از هر مرحله چک میکنه؛ اگه کروتین «cancel» شده باشه، «CancellationException» پرتاب میشه و تمیز خارج میشه. ✅
«delay» و «withContext» خودشون «cancellable» هستن، ولی کار «CPU-Intensive» رو حتماً خودت چک کن! 💡
نکته حرفهای: برای پاکسازی منابع، از «finally» یا «invokeOnCompletion» استفاده کن. 🧹
جمعبندی: لغو در کروتینها وظیفهی خودته؛ پس همیشه همکاری کن! 🎯
#Codeit #Android #Kotlin #Jetpack #Coroutines #Cancellation #KotlinAdvanced
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2
⚡️ «Coroutines» قسمت ۱۱: «withContext» رو قورت بده!
🔄 «withContext» بهت اجازه میده دیسپچر اجرای کد رو عوض کنی، بدون ساخت «Coroutine» جدید.
🧠 برخلاف «async» که یک «Coroutine» جدا میسازه، «withContext» فقط کانتکست همون «Coroutine» فعلی رو تغییر میده؛ اگه دیسپچر یکسان باشه، بدون سرباره. سبکتر و بهینهتره! 💡
📱 کاربرد واقعی: صفحه پروفایل کاربر که از دیتابیس میخونه و پردازش سنگین داره.
✍️ یک مثال عملی:
✅ نتیجه مستقیم برمیگرده؛ خبری از «await» نیست! کل عملیات روی «Dispatchers.IO» اجرا میشه.
🎯 هر وقت به نتیجه عملیات سنگین نیاز داشتی و نخواستی «Coroutine» اضافه بسازی، «withContext» بهترین انتخابه.
#Codeit #Android #Kotlin #Jetpack #Coroutines #WithContext #KotlinCoroutines #AdvancedKotlin
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔄 «withContext» بهت اجازه میده دیسپچر اجرای کد رو عوض کنی، بدون ساخت «Coroutine» جدید.
🧠 برخلاف «async» که یک «Coroutine» جدا میسازه، «withContext» فقط کانتکست همون «Coroutine» فعلی رو تغییر میده؛ اگه دیسپچر یکسان باشه، بدون سرباره. سبکتر و بهینهتره! 💡
📱 کاربرد واقعی: صفحه پروفایل کاربر که از دیتابیس میخونه و پردازش سنگین داره.
✍️ یک مثال عملی:
suspend fun loadUserProfile(): UserProfile =
withContext(Dispatchers.IO) {
UserProfile(
userRepository.getUser(),
postRepository.getPosts()
)
}
✅ نتیجه مستقیم برمیگرده؛ خبری از «await» نیست! کل عملیات روی «Dispatchers.IO» اجرا میشه.
🎯 هر وقت به نتیجه عملیات سنگین نیاز داشتی و نخواستی «Coroutine» اضافه بسازی، «withContext» بهترین انتخابه.
#Codeit #Android #Kotlin #Jetpack #Coroutines #WithContext #KotlinCoroutines #AdvancedKotlin
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🔥 «Coroutines» قسمت دوازدهم؛ نبرد «coroutineScope» و «supervisorScope»!
🧠 مدیریت خطا در «Coroutines» یکی از مهمترین مهارتهاست؛ این دو اسکوپ، رفتار کاملاً متفاوتی با خطای فرزندان دارند.
✅ «coroutineScope»: اگر یک فرزند خطا بدهد، کل اسکوپ نابود شده و بقیه فرزندان هم لغو میشوند.
✅ «supervisorScope»: خطای یک فرزند، فقط خودش را از بین میبرد و بقیه بدون وقفه کار میکنند.
🛠 مثال واقعی: در صفحه «Detail»، همزمان «UserProfile» و «Notifications» لود میشوند. اگر «Notifications» خطا بدهد، نباید پروفایل کاربر از بین برود!
پس از «supervisorScope» استفاده میکنیم:
📝 خطای «fetchNotifications» فقط همان فرزند را نابود میکند و «fetchUserProfile» نتیجهاش را سالم تحویل میدهد.
🎯 قانون طلایی: «coroutineScope» برای کارهای وابسته و «supervisorScope» برای کارهای مستقل؛ جایی که خطای یکی نباید بقیه را بگیرد.
#Codeit #Android #Kotlin #Jetpack #Coroutines #KotlinCoroutines #SupervisorScope #CoroutineScope
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🧠 مدیریت خطا در «Coroutines» یکی از مهمترین مهارتهاست؛ این دو اسکوپ، رفتار کاملاً متفاوتی با خطای فرزندان دارند.
✅ «coroutineScope»: اگر یک فرزند خطا بدهد، کل اسکوپ نابود شده و بقیه فرزندان هم لغو میشوند.
✅ «supervisorScope»: خطای یک فرزند، فقط خودش را از بین میبرد و بقیه بدون وقفه کار میکنند.
🛠 مثال واقعی: در صفحه «Detail»، همزمان «UserProfile» و «Notifications» لود میشوند. اگر «Notifications» خطا بدهد، نباید پروفایل کاربر از بین برود!
پس از «supervisorScope» استفاده میکنیم:
suspend fun loadDashboard() = supervisorScope {
val profile = async { fetchUserProfile() }
val notifications = async { fetchNotifications() }
try {
// خطای نوتیفیکیشن روی پروفایل تأثیری ندارد
showProfile(profile.await())
} catch (e: Exception) {
showError(e.message)
}
}
📝 خطای «fetchNotifications» فقط همان فرزند را نابود میکند و «fetchUserProfile» نتیجهاش را سالم تحویل میدهد.
🎯 قانون طلایی: «coroutineScope» برای کارهای وابسته و «supervisorScope» برای کارهای مستقل؛ جایی که خطای یکی نباید بقیه را بگیرد.
#Codeit #Android #Kotlin #Jetpack #Coroutines #KotlinCoroutines #SupervisorScope #CoroutineScope
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
۵ تا از معروفترین قانونهای دنیا
1️⃣ قانون مورفی
هرچی بیشتر از اتفاق افتادن یه چیز توی زندگیت بترسی، احتمال اتفاق افتادنش بیشتره.
2️⃣ قانون کیدلین
اگه یه مشکل رو بهصورت خیلی واضح و دقیق بنویسی، نصف مشکل رو حل کردی.
3️⃣ قانون گیلبرت
وقتی میخواهی کاری رو انجام بدی، پیدا کردن بهترین راه برای رسیدن به نتیجهی موردنظر فقط و فقط مسئولیت خودته.
4️⃣ قانون ویلسون
اگه دانش، اطلاعات و هوش رو اولویت قرار بدی، پول هم خودش میاد.
5️⃣ قانون فالکلند
اگه مجبور نیستی بین دو تا چیز تصمیم بگیری، اصلاً تصمیم نگیر.
#کاربردی
@CodeitMobile
1️⃣ قانون مورفی
هرچی بیشتر از اتفاق افتادن یه چیز توی زندگیت بترسی، احتمال اتفاق افتادنش بیشتره.
2️⃣ قانون کیدلین
اگه یه مشکل رو بهصورت خیلی واضح و دقیق بنویسی، نصف مشکل رو حل کردی.
3️⃣ قانون گیلبرت
وقتی میخواهی کاری رو انجام بدی، پیدا کردن بهترین راه برای رسیدن به نتیجهی موردنظر فقط و فقط مسئولیت خودته.
4️⃣ قانون ویلسون
اگه دانش، اطلاعات و هوش رو اولویت قرار بدی، پول هم خودش میاد.
5️⃣ قانون فالکلند
اگه مجبور نیستی بین دو تا چیز تصمیم بگیری، اصلاً تصمیم نگیر.
#کاربردی
@CodeitMobile
❤1
🚀 یک سال دیگه میخوای ببینی کجا هستی؟ همون جای امروزت؟ یا یه نسخهی خیلی بهتر از خودت؟
حقیقت سادهست: پیشرفت بزرگ یهشبه اتفاق نمیافته. اون چیزی که فرق ایجاد میکنه، همون «۱٪ بهتر در روز»ه. 📈
وقتی هر روز فقط یه قدم کوچیک برمیداری، بعد از ۳۶۵ روز نهتنها ۳۶۵ قدم، بلکه هزاران قدم از نقطهی قبلی فاصله گرفتی.
شاید امروز فقط بتونی یه تابع ساده بنویسی و فردا یه باگ رو حل کنی. شاید اینا به نظر کوچیک بیان، ولی دقیقاً همینا هستن که یه «Android Developer» قوی میسازن.
بیایم سراغ دنیای واقعی: یه برنامهنویس مبتدی رو تصور کن که هر روز فقط ۳۰ دقیقه «Kotlin» یاد میگیره. نه بیشتر، نه کمتر. ⏳
بعد از ۶ ماه، همون آدم میتونه یه اپ کامل با «Jetpack Compose» بنویسه. بدون فشار و خستگی، فقط با استمرار.
اگه امروز نتونستی یه پروژهی بزرگ رو تموم کنی، اصلاً مهم نیست. مهم اینه که امروز یه کاری کردی که دیروز ازش فرار میکردی. 💪
یه «commit» کوچیک روی «GitHub» بزن، یه مقاله بخون، یه تمرین حل کن، یه ویدیو ببین. همهش حساب میشه. ✅
یادت باشه: سرعت مهم نیست؛ مهم اینه که جهت درسته و حرکتت ادامه داره. 🧭
از امروز بهجای فکر کردن به نتیجهی بزرگ، فقط روی همون قدم کوچیک امروز تمرکز کن. بقیهش خودش درست میشه. 🌱
#Codeit #Android #Kotlin #Jetpack #DeveloperMindset #Consistency #SmallSteps #Growth
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
حقیقت سادهست: پیشرفت بزرگ یهشبه اتفاق نمیافته. اون چیزی که فرق ایجاد میکنه، همون «۱٪ بهتر در روز»ه. 📈
وقتی هر روز فقط یه قدم کوچیک برمیداری، بعد از ۳۶۵ روز نهتنها ۳۶۵ قدم، بلکه هزاران قدم از نقطهی قبلی فاصله گرفتی.
شاید امروز فقط بتونی یه تابع ساده بنویسی و فردا یه باگ رو حل کنی. شاید اینا به نظر کوچیک بیان، ولی دقیقاً همینا هستن که یه «Android Developer» قوی میسازن.
بیایم سراغ دنیای واقعی: یه برنامهنویس مبتدی رو تصور کن که هر روز فقط ۳۰ دقیقه «Kotlin» یاد میگیره. نه بیشتر، نه کمتر. ⏳
بعد از ۶ ماه، همون آدم میتونه یه اپ کامل با «Jetpack Compose» بنویسه. بدون فشار و خستگی، فقط با استمرار.
اگه امروز نتونستی یه پروژهی بزرگ رو تموم کنی، اصلاً مهم نیست. مهم اینه که امروز یه کاری کردی که دیروز ازش فرار میکردی. 💪
یه «commit» کوچیک روی «GitHub» بزن، یه مقاله بخون، یه تمرین حل کن، یه ویدیو ببین. همهش حساب میشه. ✅
یادت باشه: سرعت مهم نیست؛ مهم اینه که جهت درسته و حرکتت ادامه داره. 🧭
از امروز بهجای فکر کردن به نتیجهی بزرگ، فقط روی همون قدم کوچیک امروز تمرکز کن. بقیهش خودش درست میشه. 🌱
#Codeit #Android #Kotlin #Jetpack #DeveloperMindset #Consistency #SmallSteps #Growth
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
🧵 «Coroutines» پیشرفته؛ قسمت سیزدهم: «Structured Concurrency»!
تا حالا شده بچهکوریوتینها از حیطهی پدر خارج بشن و برنامه رو به هم بریزن؟ 🤔
«Structured Concurrency» یعنی نظم والد-فرزندی بین «Scope»ها؛ درست مثل تیم کاری منظم. 💼
در این مدل، هر «Coroutine» فرزند فقط تا وقتی زندهست که والدش زنده باشه؛ با تمام شدن کار والد، همهچیز خودکار جمع میشه. 🔄
کاربرد واقعی؟ فرض کن صفحهی پرداخت باید همزمان موجودی، تخفیف و وضعیت درگاه رو بخونه. اگر یکی از اینها خطا بده، بهتره کل عملیات متوقف بشه نه اینکه نیمهکاره بمونه! 🛑
حالا ببینیم با «coroutineScope» چطور این رفتار رو پیاده میکنیم:
اگر «getDiscount» خطا بده، کل «Scope» کَنسل میشه؛ یعنی «balance» و «gateway» هم خودکار لغو میشن. 🧹
اینجا خبری از «Coroutine» سرگردان یا نشت حافظه نیست؛ ساختار خودش مراقب همهچیزه. 🧠
پس همیشه از «CoroutineScope»های والد استفاده کن و «GlobalScope» رو به عنوان ضدالگو به خاطر بسپار. 🔐
اینطوری کدت هم خواناتره، هم مقیاسپذیرتر. 🚀
#Codeit #Android #Kotlin #Jetpack #Coroutines #StructuredConcurrency #AdvancedKotlin #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
تا حالا شده بچهکوریوتینها از حیطهی پدر خارج بشن و برنامه رو به هم بریزن؟ 🤔
«Structured Concurrency» یعنی نظم والد-فرزندی بین «Scope»ها؛ درست مثل تیم کاری منظم. 💼
در این مدل، هر «Coroutine» فرزند فقط تا وقتی زندهست که والدش زنده باشه؛ با تمام شدن کار والد، همهچیز خودکار جمع میشه. 🔄
کاربرد واقعی؟ فرض کن صفحهی پرداخت باید همزمان موجودی، تخفیف و وضعیت درگاه رو بخونه. اگر یکی از اینها خطا بده، بهتره کل عملیات متوقف بشه نه اینکه نیمهکاره بمونه! 🛑
حالا ببینیم با «coroutineScope» چطور این رفتار رو پیاده میکنیم:
suspend fun fetchPaymentData() {
coroutineScope {
val balance = async { getBalance() }
val discount = async { getDiscount() }
val gateway = async { getGatewayStatus() }
showResult(balance.await(), discount.await(), gateway.await())
}
}
اگر «getDiscount» خطا بده، کل «Scope» کَنسل میشه؛ یعنی «balance» و «gateway» هم خودکار لغو میشن. 🧹
اینجا خبری از «Coroutine» سرگردان یا نشت حافظه نیست؛ ساختار خودش مراقب همهچیزه. 🧠
پس همیشه از «CoroutineScope»های والد استفاده کن و «GlobalScope» رو به عنوان ضدالگو به خاطر بسپار. 🔐
اینطوری کدت هم خواناتره، هم مقیاسپذیرتر. 🚀
#Codeit #Android #Kotlin #Jetpack #Coroutines #StructuredConcurrency #AdvancedKotlin #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1
⏱️ تا حالا شده یه عملیات دیتابیس، انقدر طول بکشه که کاربر از برنامه بزنه بیرون؟
اینجاست که «Timeouts» توی «Coroutines» نجاتت میده! 🚀
توی بخش چهاردهم، قراره یاد بگیریم چطور با «withTimeout» و «withTimeoutOrNull» جلوی آویزون موندن برنامه رو بگیریم.
🔹 مشکل: یه فراخوانی شبکه ممکنه هیچوقت جواب نده و برنامه همیشه منتظر بمونه.
🔹 راهحل: یه مهلت مشخص میکنیم؛ اگه تموم نشد، ادامه میدیم یا خطا میگیریم.
💡 کاربرد واقعی: مثلاً در یه اپ خرید، اگه سرور ظرف ۵ ثانیه جواب نداد، به کاربر پیام «اتصال برقرار نشد» نشون بدیم.
اول بذارید یه نمونه کد ساده ببینیم:
📌 این کد یعنی: حداکثر ۵ ثانیه صبر کن؛ اگه «fetchDataFromServer» تموم نشد، به جای خطا، «null» برگردون.
به این ترتیب هم برنامه کرش نمیکنه، هم کاربر بیپاسخ نمیمونه.
📌 اگه به خطا نیاز داری، از «withTimeout» استفاده کن؛ اگه بخوای حالت خالی رو مدیریت کنی، «withTimeoutOrNull» مناسبتره.
✅ نکته مهم: «Timeouts» مخصوص عملیاتهای طولانی مثل شبکه، دیتابیس یا «File I/O» هست و جلوی قفل شدن «UI» رو میگیره.
✨ تمرین کن و توی پروژههات از «withTimeoutOrNull» برای فراخوانیهای شبکه استفاده کن.
#Codeit #Android #Kotlin #Jetpack #Coroutines #Timeouts #Programming #MobileDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
اینجاست که «Timeouts» توی «Coroutines» نجاتت میده! 🚀
توی بخش چهاردهم، قراره یاد بگیریم چطور با «withTimeout» و «withTimeoutOrNull» جلوی آویزون موندن برنامه رو بگیریم.
🔹 مشکل: یه فراخوانی شبکه ممکنه هیچوقت جواب نده و برنامه همیشه منتظر بمونه.
🔹 راهحل: یه مهلت مشخص میکنیم؛ اگه تموم نشد، ادامه میدیم یا خطا میگیریم.
💡 کاربرد واقعی: مثلاً در یه اپ خرید، اگه سرور ظرف ۵ ثانیه جواب نداد، به کاربر پیام «اتصال برقرار نشد» نشون بدیم.
اول بذارید یه نمونه کد ساده ببینیم:
fun main() = runBlocking {
val result = withTimeoutOrNull(5000L) {
fetchDataFromServer()
"Done"
}
if (result == null) {
println("درخواست لغو شد؛ دوباره تلاش کنید.")
} else {
println(result)
}
}📌 این کد یعنی: حداکثر ۵ ثانیه صبر کن؛ اگه «fetchDataFromServer» تموم نشد، به جای خطا، «null» برگردون.
به این ترتیب هم برنامه کرش نمیکنه، هم کاربر بیپاسخ نمیمونه.
📌 اگه به خطا نیاز داری، از «withTimeout» استفاده کن؛ اگه بخوای حالت خالی رو مدیریت کنی، «withTimeoutOrNull» مناسبتره.
✅ نکته مهم: «Timeouts» مخصوص عملیاتهای طولانی مثل شبکه، دیتابیس یا «File I/O» هست و جلوی قفل شدن «UI» رو میگیره.
✨ تمرین کن و توی پروژههات از «withTimeoutOrNull» برای فراخوانیهای شبکه استفاده کن.
#Codeit #Android #Kotlin #Jetpack #Coroutines #Timeouts #Programming #MobileDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1