تا الان چند مقاله در مورد Coroutines در ویرگول گذاشتم ، اما این مقاله بدون شک مهمترین و اصلیترین و کاربردیترین مقاله ای هست که در مورد Coroutines خواهم گذاشت ، از ورژن 2.6 به بعد در Retrofit امکان اتصال اون به Coroutines برای ما وجود داره و ما در این مقاله میخوایم این دو رو به هم وصل کنیم .
قبل از خواندن این مقاله این مقالات رو بخونید :
4. تشخیص Exception ها در Coroutines
یک ریکوئست که لیستی از آیتم ها رو گرفته و به ما برگردونه
در ابتدا با قسمتهای راحت ترِ کار شروع میکنیم ، اول کلاس Model خودمون رو درست میکنیم :
بعد از اون نیاز داریم Interface وب سرویس هامون رو ایجاد کنیم ، در این مرحله یک تفاوت با روش کلاسیک وجود داره ، چون قراره اون وب سرویس درون یک Coroutine اجرا بشه پس باید نوع تابع ما suspend باشه :
تا اینجایِ کار چیز خاصی نگفتیم ، الان نوبت فایل apiCall هست که درونش قراره چند تابع که کلِ کار رو برای ما هندل میکنند رو قرار بدیم ، ما در Kotlin این امکان رو داریم که یک تابع رو به عنوان ورودی تابع دیگه بدیم ، در اینجا هم قراره تابعی که سرویس مورد نظر رو اجرا میکنه رو به عنوان ورودی تابعهای دیگه قرار بدیم ، یکی دیگه از ورودیهامون یک callBack به اسم RemoteErrorEmitter خواهد بود که باید Activity یا جایی که قراره رکوئست اجرا بشه ازش Implement بشه (در مثال ما Activity خواهد بود) :
در مورد ورودیها توضیح دادم ، اما در مورد عملیات درونِ تابع : ما در یک try و catch کار رو انجام میدیم ، در قسمت try برمیداریم یک Coroutine رو اجرا میکنیم (به حالت تایمری که در این مقاله توضیح دادم) و تابع responseFunction رو اجرا کرده و مجموعه رو به عنوان خروجی برمیگردونیم ، در صورتی که مشکلی بود و خطایی رخ داد وارد catch میشیم و بسته به نوعِ خطا type خاصی از ErrorType رو درون emitter (که گفتم مثلا Activity یا ... رو ازش Implement میکنید) پاس میدیم ، دقت کنید که برای خطا اومدیم Thread رو به Main تغییر دادیم ، اما کار تموم نشده ، ما باید خروجی رو به صورت یک LiveData پاس بدیم که در Activity اون رو Observe کنیم (به این مقاله مراجع کنید) ، در Coroutine یک Builder مخصوص این کار وجود داره ، ما برای فراخونی اصلی از تابعی به اسم apiCall استفاده میکنیم که درونش privateApiCall استفاده میشه :
در این کد با استفاده از Builder مخصوص یک LiveData از مدل پاس داده میشه ، اگه دقت کنید ما تابع responseFunction رو به صورت {} پاس دادیم که syntax قضیه است و نکته خاصی نداره ، تابع emit هم برای ما اون تابع suspend ای رو که داشتیم (privateApiCall) فراخونی کرده و Value مورد نظر رو ازش میگیره و انتشار میده . زیبا بود نه ؟ حالا دیگه کار راحت شده و فقط مونده قسمت فراخونی و قسمت RemoteErrorEmitter که در موردش در بالاتر صحبت کرده بودیم :
و برای فراخونی :
کاری که اینجا کرده شده اینه که apiCall رو صدا میزنیم و درونش تابع مورد نظر از webService رو پاس میدیم ، خروجی یک LiveData خواهد بود که اونو باید observe کنیم (یعنی هر وقت مقدارش رسید عملیات درون observe اجرا میشه ، که این observe کردن یک ورودی برای lifeCycle میخواد که همون Activity رو میدیم (لایف سایکلِ اکتیویتی پاس داده میشه در واقع) و یک Observer که عملیات دریافت رو مدیریت کنه ، ورودی داخل Observer که it هست از جنس MutableList<Post> هستش . کلاس RetrofitBuilder هم که مثل قبلا هست و چیز خاصی نداره و اونو تو خودِ لینکِ گیت ببینید .
لینکِ گیتِ این مقاله :
https://gitlab.com/drflakelorenzgerman/coroutine-with-retrofit
من رو در لینکدین و اینستاگرام دنبال کنید ???
اگه دوست داشتید میتونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???