Coroutines چیست ؟
سلام دوستان گرامی در این سری از آموزش برنامه نویسی اندروید به آموزش Coroutines در اندروید می پردازیم coroutines همراه با کاتلین به اندروید اضافه گردید با ما همراه باشید تا بیشتر با این کد آشنا شوید.
Coroutines چیست ؟
1 2 3 | Coroutines = Co + Routines |
در اینجا co به معنی cooperation و routines به معنی function است. این به معنی است که توابع با یکدیگر به صورت مرتبط کار می کنند.
خب بریم سراغ مثال در پایین یک مثال ساده با دو فانکشن نوشته شده است
functionA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | fun functionA(case: Int) { when (case) { 1 -> { taskA1() functionB(1) } 2 -> { taskA2() functionB(2) } 3 -> { taskA3() functionB(3) } 4 -> { taskA4() functionB(4) } } } |
functionB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | fun functionB(case: Int) { when (case) { 1 -> { taskB1() functionA(2) } 2 -> { taskB2() functionA(3) } 3 -> { taskB3() functionA(4) } 4 -> { taskB4() } } } |
در اینجا زمانی که functionA مقدار یک را در ورودی بگیرد functionB اجرا خواهد شد و در زمانی که کار functionB به اتمام برسد کار در FunctionA اجرا خواهد شد به این کار cooperation گفته می شود با استفاده از Coroutines می توان به راحتی بدون استفاده از when و case می توانید پیاده سازی کنید.
دو نوع Coroutines وجود دارد که عبارتند از :
- Stackless
- Stackful
kotlin از stackless coroutines استفاده می کند به این معنی که coroutines استک خودشان را ندارند پس fucntion ها بروی ترد های native به صورت map کار نمی کنند. (به زبان ساده در ترد رزور شده کار می کنند.)
در سایت کاتلین Coroutines به این شکل توضیح داده شده است.
در وهله اول coroutine یک ترد سبک است. مثل ترد کار می کند coroutines ها می توانند به صورت paraellel اجرا شوند همینطور می توانند wait داشته باشند و با یک دیگر کار کنند.بزرگترین تفاوت بین coroutine و ترد free و cheap بودن آنهاست شما می توانید هزاران coroutine ایجاد کنید ولی در performance مشکلی نخواهید دید ولی اگر همین کار را ترد انجام دهید قطعا با مشکل memory leak مواجه خواهید شد.
coroutine جایگزینی برای ترد نیستند ولی بیشتر شبیه به framework برای مدیریت ترد اند.
مثال
1 2 3 4 | suspend fun fetchAndShowUser() { val user = fetchUser() // fetch on IO thread showUser(user) // back on UI thread } |
شما در لحظه می توانید داده را fetch کرده و بعد آن را اجرا کنید.
موفق باشید.