توابع تعلیقی (Suspending functions) درCoroutine
در این مقاله ، توابع تعلیقی و نحوه عملکرد آن در coroutine android را به شما نشان خواهیم داد. اینکه چه نیازی به این موارد در یک coroutine وجود دارد و چگونه callback را به صورت یکپارچه ایجاد میکنند.
در چه مواردی به توابع تعلیقی نیاز داریم؟
در coroutine ، اگر سعی کنید به یک تابع از coroutine دسترسی پیدا کنید ، خطایی دریافت خواهید کرد مگر اینکه آن را به یک تابع تعلیقی تبدیل کنید.در جلسات قبلی با مفاهیم اصول اولیه coroutines و آشنایی با Coroutine Scope آشنا شدیم. در این جلسه قصد داریم با مبحث suspend function ها در coroutines آشنا شویم.
مثالی از توابع تعلیقی Suspending
در این مثال ، از تابع () composeMessage و یک متغیر به نام count که برابر با صفر است استفاده می کنیم. با استفاده از این متغیر ما به سادگی تعداد تماس ها را برای تعلیق فانکشن ردیابی می کنیم. با این حال ، توابع تعلیقی composeMessage() بخشی از Coroutine خواهد بود. در اینجا نحوه ارتباط بین Thread اصلی و یک coroutine آسان خواهد بود.
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
var count = 0
fun main() {
}
suspend fun composeMessage() {
delay(500L)
println("Android!")
count++
}
ایجاد improveMessage()
اجازه دهید جلوتر برویم و یک تابع دیگر به طور فرضی با نام improveMessage() ایجاد کنیم. این تابع نیز به نوعی کارهای مشابه را انجام می دهد. بنابراین اینجا تأخیر 1 ثانیه است و به سادگی پیامی را مانند زیر به وسیله دستورprintln چاپ خواهد کرد.
suspend fun improveMessage() {
delay(1000L)
println("Suspend functions are cool")
count++
}
فراخوانی توابع در Thread اصلی
حالا در برنامه اصلی خود ، این دو coroutine را مانند زیر راه اندازی کنید.
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
var count = 0
fun main() {
GlobalScope.launch { composeMessage() }
GlobalScope.launch { improveMessage() }
print("Hi, ")
Thread.sleep(2000L)
println("There have been $count calls so far")
}
suspend fun composeMessage() {
delay(500L)
println("Android!")
count++
}
suspend fun improveMessage() {
delay(1000L)
println("Suspend functions are cool")
count++
}
خروجی
حالا اجازه دهید برنامه را اجرا کنیم و خروجی را ببینیم
Hi, Android!
Suspend functions are cool
There have been 2 calls so far
بنابراین در کنسول ما در ابتدا Hi, را دریافت می کنیم و نیم ثانیه بعد Android! را دریافت خواهیم کرد. سپس ما در ثانیه دوم دومین پیام را از طریق متد improveMessage() دریافت خواهیم کرد. سپس متغیر count را چک می کنیم.
ما در Thread اصلی که توسط Coroutine آپدیت شده، به آن متغیر دسترسی داریم. بنابراین چگونگی کار همگام سازی را نشان می دهد و بسیار آسان است که توابع یا متغیرها را در Thread اصلی Coroutine به روز کنید.
نتیجه
این یک داستان تخیلی چندان پیچیده نیست و احتمالاً در شرایط واقعی بسیار مفید نیست. اما مطمئن هستیم که این مطلب نشان می دهد که چگونه می توان یک تابع را از طریق Coroutine اجرا کرد. همچنین مهم است که چگونه می توانیم متغیرهای local را از طریق یک Coroutine به روز کنیم.
دیدگاهتان را بنویسید