مقالات

آموزش Async/await در کروتین‌های اندروید

Async/await یک الگویی است که به شما اجازه می‌دهد توابع ناهمگام را به صورت همزمان و خطی نوشته و اجرا کنید و از پیچیدگی‌های مربوط به callback‌ها و توابع کالبک جلوگیری کنید. ویژگی Async/await نیز در کروتین‌های اندروید و با استفاده از زبان برنامه‌نویسی Kotlin، موجود است.

 

 

“ما را در اینستاگرام دنبال کنید”

در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد الگوی Async/await در کروتین‌ها، صحبت کنیم. پس با سایت ترولرن همراه باش.

“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”

توی دوره ژنرال صفر تا صد الگوی Async/await رو در فصل کروتین‌ها کامل توضیح دادیم و همچنین توی پروژه های دیجی کالا و اسنپ فود به صورت عملی و پروژه محور از الگوی Async/await استفاده کردیم و بطور کامل اون رو آموزش دادیم.

الگوی Async/await در کروتین‌ها

Async/await در کروتین‌ها یک الگو برنامه‌نویسی است که به شما اجازه می‌دهد توابع ناهمگام را به صورت همزمان و خطی نوشته و اجرا کنید. این الگو در زبان‌ها و فریم‌ورک‌هایی که از کروتین‌ها پشتیبانی می‌کنند، مانند کاتلین، استفاده می‌شود.

در الگوی Async/await، توابع ناهمگام به کمک کلیدواژه suspend مشخص می‌شوند. وقتی یک تابع suspend فراخوانی می‌شود، اجرای آن تا زمانی که عملیات ناهمگامی که در آن انجام می‌شود تمام شود، متوقف می‌شود. به جای انتظار فعالیت ناهمگام، تابع suspend به کروتین اجازه می‌دهد به سایر کروتین‌ها منتقل شود و اجرای کروتین‌های دیگر را ادامه دهد.

کلیدواژه await بر روی یک تابع ناهمگام استفاده می‌شود و تا زمان اتمام آن تابع ناهمگام، اجرای کروتین فعلی را متوقف می‌کند. هنگامی که تابع ناهمگام به پایان می‌رسد، نتیجه‌ای که تابع برمی‌گرداند را می‌توان بازیابی کرد و به ادامه اجرای کروتین برگشت داد.

با استفاده از Async/await، می‌توانید کدهای ناهمگام را به صورت ساده و خوانا بنویسید. به جای استفاده از callback‌ها یا توابع کالبک، می‌توانید از ساختار همزمانی خطی استفاده کنید که برنامه را بهبود می‌بخشد و کد را خواناتر می‌کند. الگوی Async/await باعث کاهش پیچیدگی و افزایش خوانایی کد می‌شود.

در کروتین‌ها، شما می‌توانید توابع ناهمگام را با استفاده از کلیدواژه suspend تعریف کنید. سپس می‌توانید از توابع Async برای شروع عملیات ناهمگام استفاده کنید و با استفاده از await می‌توانید تا زمان انتهای عملیات ناهمگام، اجرای کروتین را متوقف کنید.

 برخی مفاهیم مهم در مورد الگوی Async/await در کروتین‌ها

توابع Suspend

توابع suspend در کاتلین مشخص می‌کنند که یک تابع قابلیت تعلیق (suspend) را دارد و می‌تواند در یک کروتین اجرا شود. این توابع معمولاً برای انجام عملیات‌های ناهمگام استفاده می‌شوند.

توابع Async

تابع async در کروتین‌ها یک عملیات ناهمگام را شروع می‌کند و یک Deferred بازگشت می‌دهد. یک Deferred یک نوع خاص از Job است که می‌توانید از آن برای دریافت نتیجه یا مدیریت وضعیت عملیات ناهمگام استفاده کنید.

کلیدواژه Await

کلیدواژه await بر روی یک Deferred صدا زده می‌شود و تا زمان تمام شدن آن عملیات ناهمگام را متوقف می‌کند. هنگامی که عملیات ناهمگام به پایان رسید، مقدار بازگشتی آن به صورت نتیجه برگشت داده می‌شود.

بلاک try-catch

می‌توانید بلاک try-catch را در داخل توابع suspend استفاده کنید تا خطاها را مدیریت کنید. با استفاده از این بلاک، شما می‌توانید خطاهایی که در طول اجرای عملیات ناهمگام رخ می‌دهند را بررسی کرده و به درستی برخورد کنید.

استفاده از کروتین‌ها

برای اجرای توابع suspend و استفاده از الگوی Async/await، باید از کروتین‌ها استفاده کنید. کروتین‌ها یک الگوی برنامه‌نویسی ناهمگام هستند که در کاتلین برای ایجاد عملیات‌های ناهمگام و اجرای آن‌ها به صورت همزمان استفاده می‌شوند.

الگوی Async/await در کاتلین می‌تواند بسیار مفید باشد، به خصوص زمانی که نیاز به انجام عملیات‌های ناهمگام پیاپی و پیچیده دارید. با استفاده از این الگو، می‌توانید کدهای خود را ساده‌تر نگه دارید و مشکلاتی مانند callback hell و تداخل منطق برنامه را بهبود بخشید.

 

 

مثالی برای درک بهتر الگوی Async/await در کروتین‌ها

برای استفاده از تابع suspend در کروتین‌ها، شما باید از کلیدواژه suspend را در تعریف تابع قرار دهید. مثلاً:

suspend fun fetchDataFromNetwork(): String {
    // کدهای ناهمگام
}

سپس، شما می‌توانید از کلیدواژه await در داخل تابع suspend برای صبر بر تکمیل عملیات ناهمگام استفاده کنید. مثلاً:

suspend fun fetchDataFromNetwork(): String {
    val result = myApiCall().await() // صبر بر تکمیل عملیات ناهمگام
    // استفاده از نتیجه
    return result
}

در مثال بالا، myApiCall() یک تابع ناهمگام است که یک شیء Deferred برمی‌گرداند. با استفاده از کلیدواژه await، تابع fetchDataFromNetwork() صبر می‌کند تا عملیات ناهمگام تکمیل شود و سپس نتیجه را برمی‌گرداند.

برای استفاده از تابع suspend در کروتین‌ها، شما باید از کلیدواژه suspend را در تعریف تابع قرار دهید. مثال:

suspend fun fetchDataFromNetwork(): String {
    // کدهای ناهمگام
}

سپس، شما می‌توانید از کلیدواژه await در داخل تابع suspend برای صبر بر تکمیل عملیات ناهمگام استفاده کنید. مثال:

suspend fun fetchDataFromNetwork(): String {
    val result = myApiCall().await() // صبر بر تکمیل عملیات ناهمگام
    // استفاده از نتیجه
    return result
}

در مثال بالا، myApiCall() یک تابع ناهمگام است که یک شیء Deferred برمی‌گرداند. با استفاده از کلیدواژه await، تابع fetchDataFromNetwork() صبر می‌کند تا عملیات ناهمگام تکمیل شود و سپس نتیجه را برمی‌گرداند.

مثال زیر نشان می‌دهد چگونه می‌توانید از الگوی Async/await در کروتین‌ها استفاده کنید:

suspend fun fetchFirstData(): String {
    delay(1000) // تاخیر ۱ ثانیه‌ای
    return "اطلاعات اولیه"
}

suspend fun fetchSecondData(): String {
    delay(2000) // تاخیر ۲ ثانیه‌ای
    return "اطلاعات دوم"
}

suspend fun fetchData() {
    val firstData = async { fetchFirstData() } // شروع عملیات ناهمگام اول
    val secondData = async { fetchSecondData() } // شروع عملیات ناهمگام دوم

    val result1 = firstData.await() // صبر بر تکمیل عملیات ناهمگام اول
    val result2 = secondData.await() // صبر بر تکمیل عملیات ناهمگام دوم

    // استفاده از نتیجه‌ها
    println("نتیجه اول: $result1")
    println("نتیجه دوم: $result2")
}

// استفاده از کروتین برای اجرای تابع fetchData()
runBlocking {
    fetchData()
}

در مثال بالا، توابع fetchFirstData() و fetchSecondData() به‌طور مصنوعی با استفاده از تابع delay() یک تاخیر مصنوعی ایجاد می‌کنند.

تابع fetchData() از الگوی Async/await استفاده می‌کند تا همزمان دو عملیات ناهمگام (fetchFirstData() و fetchSecondData()) را صبر کرده و نتیجه آن‌ها را برگرداند. با استفاده از تابع async و کلیدواژه await، کروتین‌ها به‌صورت خطی و همزمان اجرا می‌شوند.

استفاده از الگوی Async/await در کروتین‌ها نه تنها کدهای شما را خواناتر می‌کند، بلکه همچنین قابلیت ایجاد رفتار مناسب تر در برابر خطاها را نیز فراهم می‌کند.

شما می‌توانید از کلیدواژه try-catch در داخل توابع suspend استفاده کنید تا خطاها را قبل از رسیدن به نقطه await کنترل کنید و به درستی برخورد کنید.

با استفاده از الگوی Async/awaitدر کروتین‌ها، می‌توانید تعدادی عملیات ناهمگام را همزمان اجرا کنید و منتظر پایان آن‌ها بمانید.

الگوی async/await به شما امکان می‌دهد تا با استفاده از کلیدواژه async یک عملیات ناهمگام را شروع کنید و با استفاده از کلیدواژه await منتظر اتمام آن شوید.

به عنوان مثال، فرض کنید می‌خواهید دو عملیات ناهمگام را همزمان انجام دهید و منتظر پایان هر دوی آن‌ها بمانید. کد زیر نحوه انجام این کار را نشان می‌دهد:

import kotlinx.coroutines.*
 
suspend fun fetchData1(): String {
    delay(1000) // تاخیر ۱ ثانیه‌ای
    return "اطلاعات ۱"
}
 
suspend fun fetchData2(): String {
    delay(2000) // تاخیر ۲ ثانیه‌ای
    return "اطلاعات ۲"
}
 
suspend fun main() {
    try {
        val data1Deferred = async { fetchData1() } // شروع عملیات ناهمگام ۱
        val data2Deferred = async { fetchData2() } // شروع عملیات ناهمگام ۲
 
        val data1 = data1Deferred.await() // منتظر تمام شدن عملیات ناهمگام ۱ شوید
        val data2 = data2Deferred.await() // منتظر تمام شدن عملیات ناهمگام ۲ شوید
 
        println("داده ۱: $data1")
        println("داده ۲: $data2")
    } catch (e: Exception) {
        println("خطا: ${e.message}")
    }
}

در این مثال، توابع fetchData1() و fetchData2() عملیات‌های ناهمگام ساده‌ای هستند که با استفاده از تابع delay() یک تاخیر مصنوعی ایجاد می‌کنند.

در تابع main()، با استفاده از کلیدواژه async، دو عملیات ناهمگام را همزمان شروع می‌کنیم و با استفاده از کلیدواژه await منتظر تمام شدن هر دوی آن‌ها می‌مانیم. سپس نتایج را در خروجی چاپ می‌کنیم.

در صورت بروز خطا در هر یک از عملیات‌های ناهمگام، می‌توانید با استفاده از بلاک try-catch در داخل تابع main() برخورد مناسبی را با خطا داشته باشید.

حرف آخر

در این مقاله، ما با استفاده از کروتین‌ها و ویژگی Async/await در اندروید، روشی ساده و کارآمد برای مدیریت عملیات ناهمگام را بررسی کردیم. با استفاده از الگوی Async/await، امکان توسعه کدهایی که از توابع ناهمگام استفاده می‌کنند، به صورت خطی و قابل فهم بیشتری فراهم می‌شود و نیازی به استفاده از callback و توابع کالبک نیست.

با استفاده از کروتین‌ها و Async/await، می‌توانید عملیات‌های ناهمگام را به صورت همزمان و خطی نوشته و اجرا کنید، که منجر به کاهش پیچیدگی کدها و افزایش خوانایی و قابلیت‌پذیری آنها می‌شود. همچنین، با استفاده از کروتین‌ها می‌توانید بهبود عملکرد و پاسخگویی برنامه خود را نیز تجربه کنید.

با این مقاله، شما می‌توانید با استفاده از Async/await در کروتین‌های اندروید، عملیات‌های ناهمگام را به صورت ساده‌تر و قابل فهم‌تری نوشته و مدیریت کنید. این الگوی برنامه‌نویسی به شما کمک می‌کند تا کدهای پیچیده‌تر را با استفاده از توابع ناهمگام، به صورت ساده‌تر و قابل خواندن بنویسید و از مزایای کروتین‌ها در اندروید بهره‌برداری کنید.

 

و همچنین ممنون میشم از طریق ستاره‌های این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.

‫3/5 ‫(2 نظر)
عاطفه امیری

Recent Posts

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید: راهنمای جامع و کاربردی

بهینه‌سازی عملکرد اپلیکیشن‌های اندروید یکی از مهم‌ترین فاکتورهایی است که برای کاربران در دنیای امروز…

4 ماه ago

سوالات مصاحبه‌ی استخدامی کاتلین همراه با جواب(قسمت چهارم)

مصاحبه‌ی استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

4 ماه ago

سوالات مصاحبه استخدام زبان کاتلین همراه با جواب(قسمت سوم)

مصاحبه استخدام زبان کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه…

4 ماه ago

سوالات مصاحبه استخدام کاتلین همراه با جواب(قسمت دوم)

مصاحبه استخدام کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

سوالات مصاحبه استخدامی کاتلین همراه با جواب(قسمت اول)

مصاحبه استخدامی کاتلین یک فرصت برای ارزیابی مهارت‌ها و توانایی‌های یک برنامه‌نویس در توسعه اپلیکیشن‌های…

5 ماه ago

نوتیفیکیشن در اندروید: نحوه کار با آن در کاتلین

نوتیفیکیشن در اندروید امروزه یکی از قابلیت‌های مهم و پرکاربرد در اپلیکیشن‌های اندروید هستند. با…

5 ماه ago