این سری نوشته ها خلاصه کتاب اموزشی به نام Android Programming: The Big Nerd Ranch Guide که سعی خواهم کرد در حال مطالعه کتاب نکات خلاصه و مفید رو بنویسم
در سری اول این مطلب در خصوص پیاده سازی ارتباط با سرور با استفاده از Retrofit به تفصیل صحبت شد و در این مطلب سعی خواهم کرد نحوه استفاده درست از Retrofit در اپ تجاری را توضیح دهم
ارتباط با سرور زمان تغییر تنظیمات دستگاه :
اگر طبق مثال مطلب قبل اپ را ساخته باشید و هنگام ارتباط به سرور دستگاه را چند بار بچرخوانید خواهید دید هر بار درخواست جدیدی به سرور ارسال می شود و این بدلیل استفاده از Retrofit در متد onCreate می باشد . در برنامه های تجاری باید وقتی که فرگمنت ساخته میشود ، درخواست به سرور ارسال شده و نتیجه در حافظه نگهداری شود تا هر بار که به آن نتیجه احتیاج بود از آن استفاده شود و با چرخیدن و دوباره سازی فرگمنت نیز اطلاعات از بین نرود .
راه حل استفاده از Viewmodel است . متد های ارسال درخواست در Viewmodel قرار دارد و در زمان ساخته شدن آن ، درخواست به سرور ارسال شده و به فرگمنت متصل خواهد شد و با دوباره سازی فرگمنت اطلاعات در Viewmodel باقی میماند و قابل استفاده است . البته در صورتی که هنگام ارسال درخواست به سرور ، فرگمنت و اکتیویتی از بین بروند نتیجه نیز از بین میرود ، اما در اپلیکیشن های تجاری ممکن است این نتایج در دیتابیس یا حافظه های داخلی ذخیره میشود تا در دفعه بعد از آن استفاده شود . همچنین می توان با استفاده از LiveData در Viewmodel نتایج را به محض اماده شدن در رابط کاربری نمایش دهید .اینکار را باید در متد onViewCreated انجام دهید تا مطمئن شوید که view به طور کامل ساخته شده و همچنین مطمئن میشوید که وقتی فرگمنت دوباره سازی میشود این متد دوباره صدا زده میشود و با استفاده از LiveData اطلاعات دوباره به نمایش در می اید .
لغو درخواست :
ممکن است طراحی برنامه به شکلی باشد که با از بین رفتن Viewmodel نیاز به نگهداری نتایج نباشد . میتوان با cancel کردن شی Call درخواست را لغو کنیم و عملا به برنامه خواهیم گفت نیاز به برگرداندن نتیجه نیست . اینکار با صدا زدن Call.cancel انجام میشود و بعد از آن Callback.onFailure اجرا خواهد شد که میتوان در آن متد ، با چک کردن Call.isCancelled مطمئن شد که درخواست لغو شده یا خطایی در سرور رخ داده است . در ضمن باید اینکار را در ViewModel.onCleared قرار داد تا هر وقت Viewmodel میخواهد از بین برود ( مثل زمانی که کاربر دکمه back را میزند و از اکتیویتی خارج میشود ) درخواست نیز کنسل شود .
مدیریت وابستگی ها :
یکی از الگو های طراحی Dependency injection است که در ان باید وابستگی بین اشیا به کمترین مقدار برسد . به بیان ساده تر ، بجای ساختن و صدا زدن یک شی در یک کلاس و وابسته شدن آن کلاس به آن شی ، آن را از طریق constractor دریافت کنیم .
FlickrFetchr(flickrApi: FlickrApi) { fun fetchContents(): LiveData<String> { ... }
در حال حاضر پیشنهاد گوگل استفاده از کتابخانه Dagger 2 برای اجرای این الگوی طراحی در اندروید می باشد .
صفحه بندی نتایج :
به صورت پیش فرض تمام اطلاعات دریافتی از سرور بصورت کامل برگردانده می شود و این نیازمند صرف وقت زیادی است . با استفاده از کتابخانه Paging در Jetpack می توان اطلاعات را صفحه بندی کرده و در صورتی که مثلا کاربر اسکرول میکند اطلاعات صفحه ها را از سرور درخواست کرد .