launch — Kotlin میں ایک Coroutine Builder جو بغیر نتیجہ لوٹائے کوروٹین شروع کرتا ہے، عملدرآمد کو کنٹرول کرنے کے لیے Job آبجیکٹ لوٹاتا ہے۔ یہ بلڈر fire-and-forget پیٹرن نافذ کرتا ہے: کوروٹین پس منظر میں کام شروع کرتا ہے اور خود بخود مکمل ہو جاتا ہے۔ JetBrains دستاویزات، 2024 کے مطابق، launch Kotlin Coroutines میں متوازی کاموں کو چلانے کا بنیادی طریقہ ہے۔
اہم نکات
launch ایک Kotlin توسیعی فنکشن ہے، جو kotlinx.coroutines درآمد کے ذریعے دستیاب ہے، دیے گئے CoroutineScope میں ایک نیا کوروٹین بناتا ہے۔ عام فنکشنز کے برعکس، launch کے اندر کا کوڈ ہم عصر طور پر عملدرآمد کرتا ہے — کوروٹین تھریڈ کو بلاک کیے بغیر معطل (suspend) ہو سکتا ہے اور بعد میں دوبارہ شروع ہو سکتا ہے۔
launch بلڈر Kotlin کوروٹین ماڈل کا بنیادی تعمیری بلاک ہے۔ یہ حساب شدہ قدر نہیں لوٹاتا لیکن ایک Job آبجیکٹ لوٹاتا ہے جو کوروٹین عملدرآمد کو کنٹرول کرنے کی اجازت دیتا ہے۔ کسی دوسرے کوروٹین کے اندر launch کے ذریعے شروع کیے گئے تمام ذیلی کوروٹین والدین سے منسلک ہوتے ہیں۔
launch بلڈر کو کئی پیرامیٹرز کے ساتھ ایک ان لائن فنکشن کے طور پر بیان کیا گیا ہے: CoroutineScope, CoroutineContext, CoroutineStart اور ایک suspend بلاک۔ پیرامیٹرز کے ڈیفالٹ اقدار ہیں، جو launch کو عام منظرناموں کے لیے آسان بناتے ہیں۔
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
context پیرامیٹر ایک CoroutineContext قبول کرتا ہے جو ڈسپیچر، استثنیٰ ہینڈلر اور نامزد عنصر کو یکجا کرتا ہے۔ اکثر غلطیوں کو الگ کرنے کے لیے Dispatchers.IO, Dispatchers.Main یا SupervisorJob منتقل کیا جاتا ہے۔
Job — لوٹایا گیا آبجیکٹ جو کوروٹین کی زندگی کے دورانیے کی نمائندگی کرتا ہے۔ Job درج ذیل حالتوں میں ہو سکتا ہے: New, Active, Completing, Completed, Cancelling, Cancelled۔ ہر حالت عملدرآمد کی صورت حال کو ظاہر کرتی ہے اور تبدیلیوں پر ردعمل ظاہر کرنے کی اجازت دیتی ہے۔
val job = CoroutineScope(Dispatchers.IO).launch {
repeat(10) { i ->
delay(1000L)
println("پیشرفت: $i")
}
}
println("کام فعال ہے: ${job.isActive}")
delay(2500L)
job.cancel()
println("کام منسوخ ہے: ${job.isCancelled}")
Job ایک درجہ بندی کو سپورٹ کرتا ہے: اگر والدین کوروٹین منسوخ ہو جاتا ہے، تو تمام ذیلی کوروٹین خود بخود منسوخ ہو جاتے ہیں۔ SupervisorJob اس رویے کو تبدیل کرتا ہے — جب ان میں سے ایک ناکام ہوتا ہے تو ذیلی کوروٹین منسوخ نہیں ہوتے۔
ساختی ہم عصرکاری کا مطلب ہے کہ ہر کوروٹین ایک مخصوص CoroutineScope کے اندر شروع کیا جاتا ہے، اور جب تک تمام ذیلی کوروٹین اپنا کام مکمل نہیں کر لیتے، scope مکمل نہیں ہوتا۔ launch اس اصول کی مکمل حمایت کرتا ہے — کسی دوسرے کوروٹین کے اندر شروع کیے گئے کوروٹین اس کے ذیلی ہوتے ہیں۔
اندرونی launch کالز کے ساتھ، کوروٹین کا ایک درخت بنتا ہے۔ والدین کوروٹین تمام ذیلی کے مکمل ہونے کا انتظار کرتا ہے، پیش قیاسی عملدرآمد ترتیب کو یقینی بناتا ہے اور وسائل کے انتظام کو آسان بناتا ہے۔
fun main() = runBlocking {
launch {
launch {
delay(1000L)
println("ذیلی 1 مکمل")
}
launch {
delay(500L)
println("ذیلی 2 مکمل")
}
println("تمام ذیلی اس لائن سے پہلے مکمل ہوتے ہیں")
}
}
یہ رویہ تھریڈ پر مبنی ہم عصرکاری سے مختلف ہے، جہاں ذیلی تھریڈ والدین سے منسلک نہیں ہوتے۔ کوروٹین میں، جب تک تمام ذیلی اپنا کام مکمل نہیں کر لیتے والدین مکمل نہیں ہوتا۔
launch میں استثنیٰ ہینڈلنگ Job کی قسم پر منحصر ہے۔ عام Job کے لیے، استثنیٰ والدین کوروٹین میں پھیل جاتے ہیں اور اسے منسوخ کر دیتے ہیں۔ SupervisorJob یا SupervisorScope کے لیے، استثنیٰ الگ تھلگ ہوتے ہیں — ایک ذیلی کوروٹین میں غلطی دوسروں کو متاثر نہیں کرتی۔
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
try {
riskyOperation()
} catch (e: Exception) {
println("پکڑا گیا: ${e.message}")
}
}
scope.launch {
println("یہ SupervisorJob کی بدولت اب بھی چلتا ہے")
}
غیر پکڑے گئے استثنیٰ کے عالمی انتظام کے لیے، CoroutineExceptionHandler استعمال کیا جاتا ہے۔ یہ ان استثنیٰ کو پکڑتا ہے جو کوروٹین کے اندر ہینڈل نہیں کیے گئے اور ایپلیکیشن کو کریش کیے بغیر غلطی لاگ کرنے کی اجازت دیتا ہے۔
Android میں، launch ہر جگہ استعمال ہوتا ہے: ViewModel سے WorkManager تک۔ بنیادی پیٹرن جزو کی زندگی کے دورانیے کے خاتمے پر خودکار کوروٹین منسوخی کے لیے Fragment میں lifecycleScope اور ViewModel میں viewModelScope استعمال کرنا ہے۔
class ProfileViewModel : ViewModel() {
private val repository = UserRepository()
fun loadProfile(userId: String) {
viewModelScope.launch(Dispatchers.IO) {
val profile = repository.fetchProfile(userId)
withContext(Dispatchers.Main) {
_profileState.update { it.copy(profile = profile) }
}
}
}
}
viewModelScope ViewModel کے تباہ ہونے پر خود بخود کوروٹین منسوخ کر دیتا ہے۔ یہ رساو کو ختم کرتا ہے اور یقینی بناتا ہے کہ سیاق و سباق کھونے کے بعد پس منظر کی کارروائیاں جاری نہ رہیں۔ اضافی طور پر، ڈسپیچر کے درمیان سوئچ کرنے کے لیے withContext استعمال کیا جا سکتا ہے۔
اکثر پوچھے گئے سوالات
launch Job لوٹاتا ہے اور نتیجہ نہیں لوٹاتا، جبکہ async نتیجہ حاصل کرنے کے لیے Deferred<T> لوٹاتا ہے۔ launch fire-and-forget کارروائیوں کے لیے استعمال ہوتا ہے، async — جب آپ کو لوٹائی گئی قدر کا انتظار کرنے اور استعمال کرنے کی ضرورت ہو۔
محفوظ کردہ Job آبجیکٹ پر job.cancel() کال کریں۔ گروپ منسوخی کے لیے، scope.cancel() کے ذریعے پورے CoroutineScope کو منسوخ کریں۔ کوروٹین کو تعاون کرنے والا ہونا چاہیے — isActive چیک کریں یا منسوخ کیے جانے کے قابل suspend فنکشن استعمال کریں۔
launch بلاک کے اندر try-catch استعمال کریں یا CoroutineContext میں CoroutineExceptionHandler منتقل کریں۔ غلطیوں کو الگ کرنے کے لیے SupervisorJob استعمال کریں — تب ایک ذیلی کوروٹین میں استثنیٰ دوسروں کو منسوخ نہیں کرے گا۔
نہیں، launch CoroutineScope کا ایک توسیعی فنکشن ہے۔ scope کے بغیر، کوروٹین ساختی ہم عصرکاری کے اصول پر عمل نہیں کر سکتا۔ GlobalScope.launch کو احتیاط سے استعمال کریں — یہ ایک زندگی کے دورانیے سے منسلک نہ ہونے والا کوروٹین بناتا ہے۔
تعداد ڈسپیچر کے تھریڈ پول سے محدود ہے۔ Dispatchers.Default CPU کور کی تعداد کے برابر تھریڈ استعمال کرتا ہے۔ Dispatchers.IO 64 تھریڈ تک سپورٹ کرتا ہے۔ زیادہ کوروٹین شروع کرنے پر وہ قطار میں لگ جاتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں