توضیحات محصول

Volley یک کتابخونه Http هست که توسط شرکت گوگل توسعه ، و در Google IO 2013 به صورت رسمی معرفی شده ؛ تا بتونه در خواست های سمت سرور اپلیکیشن های اندرویدی رو به شکل چشم گیری سریع تر و راحتتر انجام بده .

تا قیل از انتشار کتابخانه Volley ، برنامه نویس ها برای ارتباطات سمت سرور و توسعه دادن سیستم RESTful بین کلاینت و ریموت سرورشون مجبور بودن که از کلاس استاندارد جاوا با نام java.net.HttpURLConnection و کلاس استاندارد آپاچی با نام org.apache.http.client استفاده کنند .

مشکل عمده ای که برنامه نویس ها ، سر کار کردن با این دو کلاس داشتند این بود که :

علاوه بر باگهایی که باید شبانه روزی باهاشون سروکله میزدند تا درست بشه ؛ اگر چنانچه قصد داشتند معماریی رو پیاده کنند که بتونه به صورت اتوماتیک عکس یا داده های دریافتی رو کش کنه یا مثلا بتونه چندین درخواست همزمان رو برای سرور ارسال کنه ، نیاز به نوشتن و پیاده سازیه اون معماری  به صورت زیربنایی و پایه ای بودند ، که بتونه این کار رو انجام بده .

اگر کمی با کلاس های بالا که ذکر شد کار کرده باشید به سرعت متوجه مشکلات و باگ های موجود در آن ها خواهید بود . مثلا اگر بخواهید از سیستم کشینگ استفاده کنید یا درخواست ها را صف بندی کنید ، قابلیت هایی هستند که توسط کتابخانه ی volley به راحتی میتوانید .

 

استفاده کردن از کتابخانه Volley مزیت های زیر رو برای شما به همراه خواهد داشت :

۱ – به صورت اتوماتیک درخواست های سمت سرور زمان بندی میشه .

۲ – امکان برقراری چندیدن network connection همزمان .

۳ – کش کردن پنهانداده های دریافتی مانند عکس (انسجام حافظه پنهان)

۴ – امکان ارسال درخواست های متفاوت مثل

✅ دانلود فایل(Download Request)
✅ ارسال و دریافت داده ها به صورت بایت(Byte Request)
✅ دانلود تصاویر(Image Request)
✅ ارسال و دریافت داده های به صورت جیسون(Array و Object)
✅ ارسال و دریافت به صورت ارسال متن(String Request)
✅ ارسال فایل به همراه درخواست(MultiPart Request)
✅ ارسال درخواست ها با پراکسی Http و Socks

۵ – استفاده از ترد ( Thread) در هسته کتابخانه

۶ – آسانی در Custom و شخصی سازی کردن

۷ – مرتب سازی قوی درخواست ها که به شما کمک می کنه تا بتونید داده های دریافتی رو روی UI اپلیکیشن اعمال کنید

۸ – ابزار اشکال یابی و رفع خطا

۹ – مهم ترین خصوصیت آن اتصال بدون مشکل با SSL در تمامی نسخه های اندروید حتی SSL های رایگان

۱۰ – قابلیت تگ گذاشتن روی هر درخواست و گرفتن آنها در زمان دریافت نتیجه

۱۱ – نمایش میزان دانلود و آپلود فایل در Progress

۱۲ – امکان مشخص کردن زمان انقضای کش

۱۳ – امکان اولویت بندی درخواست ها

و …

سمپل های PHP دریافت و اطلاعات متن و سمپلMultipart جهت آپلود فایل و تصویر به همراه کتابخانه وجود دارد.

 

چرا کتابخانه volley ؟

برای جلوگیری از استفاده ی مجدد از  HttpUrlConnection  و HttpClient

در نسخه های پایین تر اندروید (بیشتر در نسخه ی های ۲٫۲ و ۲٫۳ اندروید ) کلاس های HttpUrlConnection  و HttpClient  ، با مشکلات فراوان و باگ های بسیاری منتشر شدند . مشکلات و باگ هایی که هرگز رفع نشدند .HttpClient  در بروزرسانی نسخه ی api 22 اندروید ، منسوخ اعلام شد . این بدین معنی بود که ممکن است از این کلاس در آینده استفاده نشود و در بروزرسانی های بعدی به کل از SDK اندروید پاک شود که چنین اتفاقی هم افتاد .

من فکر میکنم همین بزرگترین دلیل میتونه باشه که به یه کتابخانه یا کلاس قابل اعتماد ، برای انجام درخواست های شبکه ای در اندروید ، مراجعه کنیم !

 برای جلوگیری از استفاده ی کلاس AsyncTask  

بعد از منتشر شدن api 11 اندروید ، یک نوع اجباری برای برنامه نویسان اندروید بود که کارهای شبکه یا به اصطلاح دیگر، درخواست های شبکه را درون یک ترد دیگری به جز ترد اصلی برنامه  انجام دهند . منظور از ترد همان نخ در برنامه نویسی هستند و در اینجا اشاره به چند نخی دارد ! برنامه نویسان مجیور به فراگیری چند نخی و قراردادن دستورالعملهای مربوط به شبکه درون یک نخ دیگر بودند ، همین موضوع باعث استفاده ی عظیم از AsyncTask<Params, Progress, Result> در این مدت شد .

با استفاده از AsyncTask  ، شما باید مقدمات کلاس خود را درون متدی به نام onPreExecute انجام میدادید کارهایی اعم از تعریف context برنامه و …

سپس درخواست های ناهمگام را درون متدی به نام doInBackground  انجام دهید و سپس نتیجه را به onPostExecute هُل دهید و نهایتا” درون همین متد ، نتیجه را به ویوها ارجاع دهید تا نمایش داده شوند .

استفاده از این کلاس بسیار زیبا و سرراست و به همراه تنی از مثال ها و آموزش ها بود .

اما اصلی ترین مشکل کلاس این بود که شما نمیتوانستید هیچ ترتیبی برای درخواست ها قائل شوید و همانطور که میدانید بر اساس الگوریتم FIFO ، به تمام درخواست های درون این کلاس رسیدگی میشود . هر درخواستی جدیدتر از همه باشد سریعتر از همه هم انجام خواهدد شد که باعث بوجود آمدن مشکلاتی در آینده خواهد بود مخصوصا زمانی که درخواست های ما ، اولویت های گوناگون زمانی داشته باشند

در برنامه های اندرویدی فیسبوک و توئیتر و … که از لیست های طولانی استفاده میکردند مشکلاتی بوجود می آمد یکی از این مشکلات به این شرح بود : وقتی که شما یک لیستی را باز میکردید که هر آیتم لیست دارای یک تصویر بند انگشتی بود ، زمان اسکرول به پایین انتظار میرفت که ابتدا JSON لود شود و سپس تصاویر بند انگشتی که الویت بندی کردن در این حالت ها امکان پذیر نبود

کتابخانه ی volley این مشکل را نیز برای برنامه نویسان حل کرد ! دیگر نیازی به چک کردن onPostExecute  نبود و همچنین از خطاهایی مانند NullPointerException که یکی از مشکلات استفاده از کلاس AsyncTask برای درخواست های شبکه ای بود ، جلوگیری به عمل می آمد .

سرعت بالای Volley 

چندی پیش تیم گوگل پلاس ، آزمایش هایی را روی تمام روش های ارائه شده برای بهبود سرعت درخواست های شبکه ای داخل برنامه ی اندروید انجام داد . نتیجه ی این آزمایشات حاکی از سرعت بالای volley نسبت به دیگر روش ها ، برای درخواست های شبکه ای مبتنی بر RESTful بود .

volley همه چیز را Cache میکند 

volley بطور خودکار تمام درخواست ها را کش میکند و این یعنی صرفه جویی در زمان ، برای درک بهتر بیایید به مثالی که در بالا زدیم برگردیم ، لیستی دراز که درون هر آیتم یک تصویر بند انگشتی و یک متن توضیحی وجود دارد .

حالا فکر کنید چه اتفاقی میوفتد اگر کاربر گوشی خود را بچرخاند ! : اکتیویتی ریستارت میشود ( چرخه ی حیات اکتیویتی ) ، درخواست مجددا از طریق شبکه ارسال میشود و محتویات لیست دوباره دانلود میشود ، بطور خلاصه این عمل یعنی هدر دادن زمان و حجم اینترنت کاربری و همچنین ایجاد حس بد نسبت به برنامه .

در اینجا نیز کتابخانه ی volley بار دیگر توانایی خود را ثابت میکند . Volly تمام کارهایی که انجام گرفته است را میتواند به خاطر بیاورد ، آنها را به متد تخریب اکتیویتی پاس کند و مجددا در متد ساخته شدن مجدد اکتیویتی بازیابی کند ، volley همه چیز را کش میکند بدون اینکه شما نگرانی داشته باشید .

دستورالعمل های کوچک در volley 

کتابخانه ی volley بخاطر کدنویسی و فراخوانی های کمتر ، یک کتابخانه ی عالی در زمینه ی درخواست های شبکه در برنامه های اندرویدی هست .درخواست هایی مانند : JSON objects ، دریافت بخش هایی  از یک لیست ، چزئیات آیتم انتخاب شده و غیره . همه ی ما میدانیم که volley فقط و فقط با یک هدف بوجود آمده است و آن هم برنامه های مبتنی بر RESTful ، و مطمئنا” هر چیزی مخصوص یک کاری باشد کارآیی بهتری خواهد داشت .

به هرحال کتابخانه ی volley برای کارهایی نیز نامناسب میباشد ، کارهایی مانند stream کردن یا دانلود های عظیم . لازم به ذکر است که نام این کتابخانه هیچ ارتباطی به ورزش والیبال ندارد و نام این کتابخانه نیز از لغتنامه ی ورزشی انتخاب نشده است

۲ . بررسی هسته ی کتابخانه ی volley

کتابخانه ی volley از سه سطح مختلف تشکیل شده است که هر کدام از سطح های آن ، در ترد خود عمل میکند

سطوح مختلف کتابخانه ی volley اندروید

 

ترد اصلی در کتابخانه ی Volley

در این مقاله منظور از کلمه ی “ترد” همان thread یا نخ میباشد

در thread اصلی volley  همانند AsyncTask ، شما فقط اجازه ی ایجاد و ارسال درخواست ها و همچنین دریافت پاسخ ها را دارید نه چیز بیشتر !

نتیجه ی اصلی این هست که شما هر کاری را که در متد doInBackground درون کلاس AsyncTask  انجام میداد را بتوانید به راحتی فراموش کنید چون کتابخانه ی volley بطور خودکار درخواست های HTTP را مدیریت میکند و خطاهای شبکه را که برای شما اهمیت دارند را شناسایی میکند

کَش و ترد های شبکه در کتابخانه ی Volley

وقتی شما درخواست جدیدی را در صف درخواست های volley قرار میدهید چندین عمل در هسته ی کتابخانه انجام میگیرد ، اول از همه volley کش را بررسی میکند و اگر توانایی پاسخ از طریق کش را داشته باشد ،  پاسخی که کش تحویل میدهد را میخواند پارس میکند و بعنوان پاسخی برای درخواست تحویل میدهد . به عبارت دیگر این پاسخ به تردهای شبکه تحویل داده میشود که در زیر توضیح داده میشود .

در تردهای شبکه ، یک درخواست به همراه یک سری از ترد ها بطور مداوم در حال فعالیت هستند ، اولین ترد شبکه ی در دسترسی به درخواست رسیدگی میکند و درخواست HTTP را صادر میکند ، نتیجه را تجزیه و تحلیل و یا به اصطلاح پارس میکند ، همچنین نتیجه را در کش ذخیره میکند ، در نهایت نتیجه به ترد اصلی برنامه تحویل داده میشود همان جایی که listener منتظر دریافت پاسخ هست .