Coroutine Builder — Kotlin Coroutines کے فنکشنز جو کوروٹینز بناتے اور چلاتے ہیں، ان کے عملدرآمد کا طریقہ متعین کرتے ہیں۔ بلڈرز launch، async، runBlocking اور produce مختلف منظرناموں کو کور کرتے ہیں: بیک گراؤنڈ کاموں سے لے کر نتیجہ واپس کرنے والے متوازی حسابات تک۔ JetBrains, 2024 کے مطابق، Coroutine Builder کوروٹین ماڈل کی بنیاد ہے، جو ساختی ہم آہنگی اور لائف سائیکل مینجمنٹ فراہم کرتا ہے۔
اہم نکات
Coroutine Builder ایک Kotlin ایکسٹینشن فنکشن ہے جو CoroutineScope اور ایک suspend بلاک لیتا ہے، ایک نیا کوروٹین بناتا اور چلاتا ہے۔ ہر بلڈر متعین کرتا ہے کہ کوروٹین کیسے عملدرآمد کرے گا: نتیجہ کے ساتھ یا بغیر، تھریڈ بلاکنگ کے ساتھ یا غیر متزامن طور پر۔ بلڈرز زبان کے کوروٹین ماڈل میں داخلے کے نکات ہیں۔
تمام بلڈرز CoroutineScope کے ذریعے کام کرتے ہیں، جو چائلڈ کوروٹینز کے لائف سائیکل کا انتظام کرتا ہے۔ جب کوئی دائرہ کار منسوخ ہوتا ہے، تو اس کے ذریعے چلائے جانے والے تمام کوروٹینز خود بخود منسوخ ہو جاتے ہیں — یہ ساختی ہم آہنگی کا اصول ہے۔ یہ نقطہ نظر کوروٹین لیکیج کو روکتا ہے اور پیش قیاسی خاتمے کو یقینی بناتا ہے۔
import kotlinx.coroutines.*
fun main() = runBlocking {
// بلڈرز CoroutineScope کے اندر چلتے ہیں
val job = launch {
delay(1000L)
println("دنیا!")
}
println("ہیلو،")
job.join()
}
Kotlin چار بلٹ ان کوروٹین بلڈرز فراہم کرتا ہے: launch، async، runBlocking اور produce۔ ہر ایک کا اپنا واپسی کی قسم اور اطلاق کا میدان ہے۔ Android موبائل ڈویلپمنٹ کے لیے، اہم بلڈرز launch اور async ہیں — یہ غیر مسدود طریقے سے کام کرتے ہیں اور آرکیٹیکچرل اجزاء کے ساتھ ضم ہوتے ہیں۔
| بلڈر | واپسی کی قسم | تھریڈ بلاکنگ | منظر نامہ |
|---|---|---|---|
| launch | Job | نہیں | Fire-and-forget کام |
| async | Deferred<T> | نہیں | متوازی حسابات |
| runBlocking | T | ہاں | ٹیسٹ، main فنکشن |
| produce | ReceiveChannel<E> | نہیں | سٹریمنگ (متروک) |
ہر بلڈر اضافی پیرامیٹرز قبول کرتا ہے: CoroutineStart (شروع کرنے کی حکمت عملی)، CoroutineContext (ڈسپیچر، استثنیات) اور ایک نامی کوڈ بلاک۔ ڈیفالٹ طور پر، کوروٹین فوری طور پر شروع ہوتا ہے (CoroutineStart.DEFAULT)۔
launch Android ڈویلپمنٹ میں سب سے زیادہ استعمال ہونے والا بلڈر ہے۔ یہ ایک کوروٹین شروع کرتا ہے جو نتیجہ واپس نہیں کرتا، اور اس کے لائف سائیکل کے انتظام کے لیے ایک Job آبجیکٹ واپس کرتا ہے۔ یہ ان کاموں کے لیے مثالی انتخاب ہے جن میں صرف ضمنی اثر کی ضرورت ہوتی ہے: ڈیٹا بیس میں محفوظ کرنا، تجزیات بھیجنا، انٹرفیس اپ ڈیٹ کرنا۔
launch بلڈر CoroutineScope، ایک اختیاری CoroutineContext اور ایک suspend بلاک قبول کرتا ہے۔ واپس کیا گیا Job کوروٹین کو منسوخ کرنے، اس کے مکمل ہونے کا انتظار کرنے یا اس کی حالت جانچنے کی اجازت دیتا ہے۔
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
val job: Job = scope.launch(CoroutineStart.LAZY) {
val data = fetchFromNetwork()
saveToDatabase(data)
}
job.start()
job.join()
CoroutineStart.LAZY پیرامیٹر start() یا join() کے واضح کال تک عملدرآمد کو مؤخر کرتا ہے۔ یہ تاخیری ابتدائیہ اور مشروط عملدرآمد کے لیے مفید ہے۔ معیاری فوری عملدرآمد کے لیے CoroutineStart.DEFAULT استعمال کیا جاتا ہے یا پیرامیٹر چھوڑ دیا جاتا ہے۔
async ایک بلڈر ہے جو Deferred<T> — نتیجہ کا ایک غیر متزامن وعدہ واپس کرتا ہے۔ await() کو کال کرنا تھریڈ کو بلاک کیے بغیر نتیجہ ملنے تک کوروٹین کو معطل کرتا ہے۔ یہ Kotlin کوروٹینز میں متوازی کاموں کے لیے بنیادی طریقہ کار ہے۔
async خاص طور پر اس وقت مؤثر ہے جب آپ کو ایک ساتھ متعدد آزاد کام انجام دینے ہوں۔ suspend فنکشنز کی ترتیب وار کال کے برعکس، async کوروٹینز کو متوازی چلاتا ہے، کل عملدرآمد وقت کو کم کرتا ہے۔
suspend fun fetchUserData(): UserData {
val deferred1 = CoroutineScope(Dispatchers.IO).async { api.getProfile() }
val deferred2 = CoroutineScope(Dispatchers.IO).async { api.getSettings() }
val deferred3 = CoroutineScope(Dispatchers.IO).async { api.getNotifications() }
return UserData(
profile = deferred1.await(),
settings = deferred2.await(),
notifications = deferred3.await()
)
}
Deferred Job سے وراثت پاتا ہے، لہذا async تمام لائف سائیکل کارروائیوں کو سپورٹ کرتا ہے: منسوخی، تکمیل کا انتظار، استثنیٰ ہینڈلنگ۔ جب دائرہ کار منسوخ ہوتا ہے، چائلڈ Deferred کوروٹینز خود بخود منسوخ ہو جاتے ہیں۔
runBlocking واحد بلڈر ہے جو کوروٹین کے مکمل ہونے تک موجودہ تھریڈ کو بلاک کرتا ہے۔ یہ ایک نیا CoroutineScope بناتا ہے اور منتقل کردہ کوروٹین کو چلاتا ہے، کال کرنے والے تھریڈ کو بلاک کرتا ہے۔ یہ main() انٹری پوائنٹس، ٹیسٹوں اور بلاک کرنے والے کوڈ کے ساتھ انضمام میں استعمال ہوتا ہے۔
runBlocking تین منظرناموں میں جائز ہے: ایپلیکیشن انٹری پوائنٹ (main)، suspend فنکشنز کے یونٹ ٹیسٹ اور کال بیک پر مبنی لائبریریوں کے ساتھ انضمام جہاں suspend استعمال نہیں کیا جا سکتا۔ پروڈکشن Android کوڈ میں، مرکزی تھریڈ پر runBlocking کا استعمال سختی سے تجویز نہیں کیا جاتا۔
class CoroutineTest {
@Test
fun `test suspend function`() = runBlocking {
val result = mySuspendFunction()
assertEquals("expected", result)
}
}
ٹیسٹوں کے لیے، runBlocking کے بجائے TestCoroutineDispatcher کے ساتھ kotlinx-coroutines-test استعمال کرنے کی سفارش کی جاتی ہے — یہ وقت کا کنٹرول فراہم کرتا ہے اور ٹیسٹ ماحول میں بلاکنگ سے بچاتا ہے۔
Coroutine Builder کا انتخاب واپس کردہ نتیجہ اور عملدرآمد کے منظر نامے پر منحصر ہے۔ اگر کام کو ڈیٹا واپس کرنے کی ضرورت نہیں ہے — launch استعمال کریں۔ اگر آپ کو غیر متزامن کام کے نتیجے کی ضرورت ہے — async استعمال کریں۔ runBlocking صرف پل کے لیے استعمال کریں، اور ری ایکٹیو سٹریمز کے لیے produce کو Flow سے بدلیں۔
Kotlin Coroutines استعمال کرنے والے Android منصوبوں میں، بلڈرز کا اہم جوڑا launch اور async ہے۔ launch ViewModel اور UseCases میں کوروٹین شروع کرنے کے لیے استعمال ہوتا ہے، جبکہ async نیٹ ورک یا ڈیٹا بیس پر متوازی درخواستوں کے لیے استعمال ہوتا ہے۔ جدید لائبریریاں (Ktor, Room) پہلے ہی suspend فنکشنز کو سپورٹ کرتی ہیں، جو async کے براہ راست استعمال کی ضرورت کو کم سے کم کرتی ہیں۔
اکثر پوچھے گئے سوالات
launch Job واپس کرتا ہے اور عملدرآمد کا نتیجہ واپس نہیں کرتا، جبکہ async Deferred<T> واپس کرتا ہے — ایک آبجیکٹ جس سے await() کے ذریعے نتیجہ حاصل کیا جا سکتا ہے۔ launch fire-and-forget کاموں کے لیے، async ڈیٹا واپس کرنے والے کاموں کے لیے استعمال ہوتا ہے۔
سفارش نہیں کی جاتی۔ مرکزی تھریڈ پر runBlocking ANR کا سبب بنتا ہے اور انٹرفیس کو بلاک کرتا ہے۔ Activity اور Fragment کے اندر lifecycleScope.launch استعمال کریں — یہ بلاکنگ کے بغیر ایک بلٹ ان حل ہے۔
launch بلڈر ایک Job آبجیکٹ واپس کرتا ہے، جو کوروٹین کے لائف سائیکل کو کنٹرول کرنے کی اجازت دیتا ہے: منسوخ (cancel)، تکمیل کا انتظار (join)، حالت چیک (isActive, isCompleted, isCancelled).
Deferred<T> نتیجہ کا ایک غیر متزامن وعدہ ہے، جو async بلڈر کے ذریعے واپس کیا جاتا ہے۔ یہ Job سے وراثت پاتا ہے اور طریقے شامل کرتا ہے: نتیجہ حاصل کرنے کے لیے await()، غیر مسدود رسائی کے لیے getCompleted()، اور استثنیٰ چیک کرنے کے لیے getCompletionExceptionOrNull()۔
CoroutineStart.LAZY پیرامیٹر استعمال کریں: scope.launch(start = CoroutineStart.LAZY) { ... }۔ پھر حقیقی عملدرآمد کے لیے job.start() یا job.join() کال کریں۔ یہ تاخیری ابتدائیہ اور مشروط کوروٹین عملدرآمد کے لیے مفید ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں