Retrofit یا Volley کدام بهتر است ؟
قطعا بحث برانگیز ترین مبحث در بین دولوپرها انتخاب بهترین روش برای کد نویسی و ارتباط با سرور است و از مهمترین بحث ها این سوال است : Retrofit یا Volley کدام بهتر است ؟
کار با سرور در اپلیکیشن های موبایل؟
کار با سرور به چه معنی است ؟ به عنوان یک دولوپر اندروید ، باید کار با سرور رو یاد بگیریم یا خیر؟
سرور چیست؟
سرور یک کامپیوتر همیشه روشن و همیشه در دسترس است، زمانی که این دسترسی تنها در محدوده یک شبکه داخلی باشد، آن را سرور تحت شبکه می نامیم .
به این معنا که تمامی کامپیوترهای موجود در این شبکه از این کامپیوتر فرمان میگیرند و نیازهای تحت شبکه خود را به کمک آن تامین میکنند . پس سرور نقش آنها را در شبکه تعیین میکند .
حالا اگر گستره این شبکه را کمی بیشتر کنیم و آن را متشکل از تمام کامپیوترهایی بدانیم که از طریق اینترنت به هم وصل شده اند ، با گروه بسیار بزرگی از کامپیوترهای همیشه روشن و همیشه در دسترس از طریق اینترنت روبرو هستیم ، که به آنها سرور های اینترنتی گفته می شود .
این زنجیره وظیفه دارد ، اطلاعاتی را که در هر زمان از شبانه روز بر روی پهنای اینترنت جستجو می کنید ، در اختیار شما قرار دهد.
بنابراین به دو دسته بندی کلی میرسیم :
سرور ( server ) : کامیپوتری که سرویس می دهد.
کلاینت ( Client ) : کامپیوتری که سرویس می گیرد.
با این توصیف متوجه میشویم ، اکثر برنامه هایی که در طول روز با آنها کار میکنیم ، مانند تلگرام ، اینستاگرام ، کافه بازار و … دیتا و اطلاعات خود را از سرور های اینترنتی میگیرند.
آیا ما به عنوان یک دولوپر باید بدانیم چه اتفاقاتی در سمت سرور در حال رخ دادن است یا نه؟
تجربه نشان داده که اگر بخواهیم در زمینهای فنی و تخصصی ، حرفه ای شویم باید از مسائل پیرامون آن هم مطلع باشیم تا بتوانیم بهترین خروجی را ارائه دهیم.
پس آشنایی با سرور و راه های ارتباط با آن را هم باید بشناسیم ، حتی در حد جزئی.
خب تا به اینجا با اهمیت و کاربرد سرور آشنا شدیم .
حال سوال اصلی اینجاست :
چطور میتوانیم به سرور متصل شویم ؟ و دیتاهای ذخیره شده در دیتایس ها را دریافت کنیم؟ مانند عکس ها ، متن ها ، ویدیو ها و دیگر داکیومنت ها
API چیست؟
API مخفف واژه Application Programming Interface است که میتوان آن را با عنوان « رابط برنامهنویسی نرمافزار » ترجمه کرد.
در دنیای وب ، API ها امکان استفاده از دادههای سرویسهای بزرگ مانند گوگل یا فیسبوک را برای ما فراهم میکنند .
API به طور کلی دربرگیرنده ی متدهایی برای ارتباط با سایر لایبرری ها یا اپلیکیشن ها است.
حال اگر این اصطلاحات را در کنار یکدیگر قرار دهیم ، چیزی تحت عنوان RESTful API به وجود می آید .
که با آن میتوان کوئریهای مختلفی در بستر URL به جای پروتکل Http اعمال کرد.
خب حالا خروجی این به اصطلاح API ها چیست ؟
بعد از نوشتن یک API ، به طور کلی دو نوع خروجی برای ما فراهم میشود.
توسعه دهنده وب و توسعه دهنده اپلیکیشن تصمیم میگیرند که کدام خروجی را در این بین رد و بدل کنند.
- یکی از این نوع خروجی ها XML خواهد بود . که قطعا یادگیری آن یکی از ملزومات برنامه نویسی است .
- خروجی بعدی همان فرمت معروف JSON است .
حالا چطور این خروجی ها را از از دیتابیس سمت سرور دریافت کنیم ؟
برای اتصال به سرور و نوشتن API حتما باید به یکی از زبان ها برنامه نویسی سمت سرور آشنا باشید.
مانند PHP ، LARAVEL و … . که میتوان گفت این دو مورد، جزو محبوب ترین نوع زبان های سمت سرور یا serverside هستند. لازم به ذکر است که لاراول یکی از framework های زبان php است .
بسیار خوب چه کسی این کدها را برای ما می نویسد و خروجی مد نظر را به ما میدهد ؟
اینجاست که چالش بزرگ همه دولوپرهای اندرویدی به وجو میآید که به قول معروف بین علما بر سر این مبحث اختلاف نظرهای زیادی وجود دارد .
بعضی اعتقاد دارند یک دولوپر اندروید باید کدنویسی سمت سرور را بلد باشد و عدهای بر این عقیده هستند که هیچ اجباری برای این موضوع نیست .
تجربه نشان داده کسانی که قصد دارند توسعه دهنده اپلیکیشنهای اندروید باشند ، باید در ابتدای کار با کدنویسی PHP آشنا شوند تا بتوانند کار با سرور ، اتصال به دیتابیس و کوئری نوشتن را انجام دهند .
به این علت که اکثر برنامه نویسان در ابتدای کار تیمی را در کنار خود ندارند و یا به یک برنامه نویس سمت سرور دسترسی ندارند .
لذا خودتان باید API های سمت سرور مورد نیاز را بنویسید . در سایت نوین دولوپرز در تمام آموزش های پروژه محور به این مبحث پرداخته ایم . و حتما به یاد داشته باشید زمانی که به دنبال یادگیری و ساخت یک اپلیکیشن آنلاین هستید باید صبورتر از قبل باشید که بدانید که خواه یا ناخواه با کد های php روبرو خواهید شد که هیچ راه فراری از آن نیست .
بسار خوب بهتر است به اصل مطلب بپردازیم . ما برای اتصال به API مربوطه و گرفتن خروجی که میتواند به صورت XML یا JSON باشد ، با HttpClient های مختلفی میتوانیم این کار را انجام بدهیم .
که دو متد از بین محبوب ترینها ، متد Volley و Retrofit هستند.
Volley که در واقع یک کتابخانه توسعه داده شده توسط شرکت معظم و بزرگ گوگل است و تا به حال تنها یک ورژن از آن منتشر شده است . که نشان دهنده کامل و بی نقص بودن همان ورژن است .
گزینه بعد Retrofit است که توسط Jake Wharton کبیر توسعه داده شده است . که کار اتصال به سرور را برای ما راحتتر میکند. میتوانید درباره Jake Wharton و کتابخانه هایی که توسعه دادهاند در گیت هاب جستجوی کنید.
بسیار خوب حالا باید تصمیم بگیریم Retrofit یا Volley کدام بهتر است؟
هر دوی این کتابخانه ها میتوانند خروجی متدهای مهم و کاربردی مانند DELETE , UPDATE , INSERT , CREATE POST و GET را در اختیار ما قرا دهند اما هرکدام به روش خودش !
هردو کتابخانه متد Asynctask و پارس کردن اطلاعات JSON را با کمترین و بهینه ترین کد لازم برای ما مهیا میکنند.
استفاده از رتروفیت که مدت زمانی زیادی نیست مد شده است . و مورد استقبال برخی از دولوپر ها بوده است .
این کتابخانه با annotation و کلاس Gson برای تبدیل کردن رشته json دریافتی به یک کلاس جاوا کار را برای ما راحتتر میکند . به این معنی که دیگر خبری از JsonObject یا JsonArray در کدنویسی و پارس کردن آنها نیست.
ولی کتابخانه والی که توسط گوگل توسعه داده شده کارهای بیشتری را برای ما انجام میدهد . البته این کتابخانه الگوهای طراحی و کدنویسی مخصوص به خودش را دارد که همین موضوع باعث میشود کمی کار کردن با آن سختتر باشد .
شاید با خودتان فکر کنید که کار با والی آسان است اما دقیقا اینطور نیست ! کتابخانه والی را مانند یک سری کد open source در نظر بگیرید که میتوانید به روشهای مختلف آنها را توسعه داده و پیاده سازی کنید .
تفاوت این دو کتابخانه در چیست ؟
1. سرعت در کدام بیشتر است ؟
با نگاه به جدول زیر احتمالا جواب خود را دریافت میکنید.
اگر خوب دقت کنید خواهید دید که کتابخانه رتروفیت با اختلاف چند میلی ثانیه و فقط چند میلی ثانیه از کتابخانه والی سریعتر است.
خب آیا این ملاک خوبی برای سوئیچ کردن از والی به رتروفیت است ؟
خیر . چون نباید سرعت عمل در حد چند میلی ثانیه باعث شود که به طور قطع در نظر بگیریم که روی رتروفیت بهتر عمل میکند.
یکی از علت های این سرعت عمل در رتروفیت این است که پیچیدگی های ارتباط با سرور مثل والی را ندارد و به جواب Request در حد چند میلی ثانیه زودتر پاسخ میدهد .
2.پیچیدگی کدام بیشتر است؟
استفاده از هر دو کتابخانه رتروفیت و والی آسان است و هردوی آنها فراخوانی های شبکهای به صورت همزمان و غیر همزمان را فراهم میکنند.
در بحث هندل کردن request و response میتوان گفت که فراخوانی API در رتروفیت به صورت سادهتری انجام میشود و همانطور که گفتیم با استفاده از GsonConverter پارس کردن اطلاعات راحت تر میشود .
در صورتی که برای پارس کردن داده در والی کمی باید زحمت بیشتری بکشیم و کدنویسی بیشتری انجام دهیم.
کدنویسی سریعتر در رتروفیت نسب به والی را میتوان یک مزیت برای توسعه دهندگان اندروید در نظر گرفت.
آیا این دو کتابخانه برای کار با معماری هایی مانند MVVM یا MVP مناسب هستند ؟
بله. صد در صد هر دوتا کتابخانه برای کار با معماری ها آماده شدهاند و برای ارائه سرویس به بهترین نحو آماده هستند.
اما کتابخانه رتروفیت با داشتن متدی سادهتر ، برای کار با سرور کمی کار ما را راحتتر کرده و ما را از پیچیدگی های بیشتر مصون میدارد .
بسیار خوب تا به اینجا به مزیتهای رتروفیت پرداختیم که بیشتر به سادگی کار کردن با آن برمیگردد . اما چند مزیت مهم و کاربردی والی را نیز بررسی کنیم :
- منابع فارسی و انگلیسی زیادی برای کار با والی وجو دارد. که باعث میشود با داشتن آشنایی کافی با آن بتوانید به راحتی آن را به هر نحوی که بخواهید Config کنید.
- رتروفیت به تنهایی قابلیت لود کردن تصاویر را ندارد. لذا به کتابخانه کوچک دیگری به نام Picasso نیاز دارد که بطور قطع همه با آن شما هستید . برای لود کردن تصاویر از سرور در کنار رتروفیت استفاده از Picasso پیشنهاد میشود.
- در رتروفیت شما نمیتوانید به تنهایی لود تصاویر را داشته باشید و باید با OkHttpClient و تنظیم کردن آن ، بارگزاری تصایور را انجام دهید .
- در صورتی که در والی یک درخواست ویژه به نام ImageRequest وجود دارد که تصویر را به صورت Bitmap به ما برمیگرداند .
- در رتروفیت چیزی به اسم دخیره سازی نداریم . در صورتی که والی دارای مکانیزم ذخیره سازی دقیق و انعطاف پذیر میباشد. وقتی درخواستی از طریق والی ارسال میشود ، در صورت یافتن حافظه پنهان ، پاسخ مناسب باز میگردد .
- والی از فرواخوانیها و Request های تکراری جلوگیری میکند که این به معنی مدیریت حافظه است.
- والی با محبوب ترین سرویس گیرندگان HTTP ادغام شده ، که شامل OkHttp است . در حالی که رتروفیت به OkHttp متکی است . که این امر باعث از بین رفتن حافظه بیشتری در رتروفیت میشود.
- در بحث کش کردن هم کتابخانه والی دارای سیستم کش قدرتمندتری نسبت به رتروفیت است.
نتیجه گیری:
Retrofit یا Volley کدام بهتر است؟
این دو کتابخانه بسیار قدرتمند هستند و ما را از کار با سرور و کدنویسی های دستی برای asynctask و پارس کردن های دستی منابع بینیاز میکنند.
هر کدام از آنها ، مزیت ها و معایب خودشان را دارند . که به بررسی معایب و مزایای آن ها پرداختیم . شاید برخی به علت بلد بودن کار با والی آن را به رتروفیت ترجیح دهند و نظرشان آن باشد که کار با رتروفیت سخت است یا برعکس.
ولی شما به عنوان یه توسعه دهنده اگر میخواهید به صورت استارتاپی یا فریلنسری برای خودتان کار کنید مسلما هر کدام از این کتابخانه ها را که بلد باشید به عنوان اولویت کاریتان باید قرار دهید.
ممکن است برخی از شما دوستان در یک شرکت مشغول به فعالیت باشید ، که اکثر این شرکتها کدنویسی با رتروفیت را از شما درخواست خواهند کرد .
اما میتوانیم بگوییم 90 درصد این شرکتها اصلا نمیدانند چرا باید پروژهها را با رتروفیت انجام دهید !
به هرحال نمیتوان منکر قدرت رتروفیت شد و مزایای آن را در نظز نگرفت . اگر شما کمی با آن کار کنید متوجه خواهید شد که واقعا گزینه جذابی خواهد بود .
اما تجربه شخصی ما و تیمی نوین دولوپرز نشان داده که هر api و کتابخانه ای که گوگل توسعه آن را به عهده داشته باشد ، قطعا بهترین مهندسی و عملکرد را برای آن تدارک دیده است . که این موضوع یک مزیت بزرگ برای به کار گیری کتابخانه والی است.
در این مقاله به این موضوع پرداختیم که ممکن است کار با والی کمی سختتر به نظر برسد اما میتوان مطمئن بود که 90 درصد پروژهها پیچیدگیهای زیادی ندارند . لذا با دانشی که از والی داریم ، میتوانیم در بسیاری از پروژهها از آن استفاده کنیم . پس نباید نگرا ن بود .
در پروژه های بزرگ که نیاز به انعطاف پذیری برای ایجاد درخواست ها وجود دارد ، کتابخانه والی میتواند قدرت خودش را به رخ حریف بکشد !
شما به عنوان یک دولوپر باید با هر دوی این کتابخانهها آشنا باشید و بتوانید با آنها کار کنید . اما باید بررسی کنید که چه زمانی و در کدام پروژه کدام کتابخانه بهینهتر عمل میکند .
به طور مثال در بحث کار با معماری هایی مانند mvvm و mvp کانفیگ کردن رتروفیت راحتتر است . که به نوعی یک مزیت به حساب میآید و زمانی که شما از معماری ها استفاده میکنید در اکثر مواقع نیازی به کانفینگ های پیچیده رتروفیت نیست .
نتیجه اینکه هر توسعه دهنده اندروید باید به نسبت نیاز پروژهای که در دست دارد و یا در محیطی که در آن مشغول به کار است و همچنین سطح تسلط و دانش خودش یکی از این دو کتابخانه را انتخاب و استفاده کند.
ممنون از مقاله بسیار خوبتون
موفق باشید
ممنون از شما و خوشحالیم مقاله برای شما مفید بوده
سلام و عرض ادب . من خودم با والی راحتتر و مسلط تر هستم . در مواردی خاص در رتروفیت گیر میکنم دوباره برمیگردیم سمت والی . که جدیدا تصمیم گرفته بودم کلا رتروفیت رو فراموش کنم ولی در جایی اشاره کردین یه برنامه نویس بهتره هردو رو بلد باشه . من از این پیشنهاد شما استقبال میکنم و با مطالعه و دیدن فیلم آموزشی دانش خودم رو بیشتر میکنم. ممنون از شما
سلام دوست عزیز.به هر حال آشنایی با این دو کتابخانه برای یک دولوپر لازمه.چون به هر حال نمیدونید فردا یه پروژه برای شما تعریف بشه و مخاطب شما تاکید کنه که مثلا فقط باید با رتروفیت کار کنید. و شما تسلط لازم نداشته باشید،ممکنه یه پروژه خوب از دست بدید
با سلام .. ممنون از مقاله کاربردی شما دوست عزیز ..پاینده باشیدو
سلام.ممنون دوست عزیز از شما
با عرض سلام و خسته نباشید
ممنون از مقاله مفیدتون . من خودم از رتروفیت استفاده میکنم . اما ی چیزی توی والی گفتید که برام جذاب بود اونم کش کردن بود . این کش کردن رو میشه یکم توضیح بدید ؟ یعنی مثه ی مروگر کش میکنه ؟
سلام.وقت بخیر دوست عزیز.سیستم کش والی به این صورت هست که اول از همه volley کش موجود در داده های دریافتی را بررسی میکند و اگر توانایی پاسخ از طریق کش را داشته باشد ، پاسخی که کش تحویل میدهد را میخواند پارس میکند و بعنوان پاسخی برای درخواست تحویل میدهد .
حتما به منابع خود گوگل مراجعه کنید و هم توضیحات داده و هم نحوه پیاده سازیش گفته
سلام. از مطلب آموزنده تشکر میکنم.
فقط یک نکته:
توسعه دهندگان اندروید با این تاکیدی که در این مقاله وجود دارد لازم نیست برای طراحی اپلیکشن های متصل به سرور زبان php یا امثال آن رو فرا بگیرند.
با کیفیت خوب و فراگیری زبان سی شارپ میشه برای asp.net mvc متصل به سرور شد.
سلام.وقت بخیر.برای سمت سرور نیازی نیست حتما php کار باشید یا کد php بزنید.هر زبانی که خروجی json تحویلمون بده مهمه.ولی خب چون php بین توسعه دهندگان ایرانی و حتی خارجی باب تر هست و منابع آموزشی بیشتری داره ،پیشنهاد ما روی این زبان هست
ممنون بابت اطلاعاتی که بابت مقایسه این دو کتابخانه دادید.
ممنون از شما دوست عزیز.
ممنونم از مقاله ی خوبتون
خوشحالیم مطلب برای شما مفید بوده