ارائه مثال عملی با کتابخانه Retrofit2 – قسمت دوم

در قسمت قبل ویژگی‌ها و تغییرات Retrofit2 رو بیان کردیم. در این بخش به ارائه مثال عملی استفاده از این کتابخانه می‌پردازیم.

در این برنامه دو درخواست به دو سرور مختلف ارسال می‌شه. اولی به یک فایل json خواهد‌ بود که داخل اون لیستی از اسامی فیلم و امتیاز به همراه لینک عکس پوستر آنها قرار داره. اطلاعات دریافت‌شده توسط ListView نمایش داده می‌شه. همچنین عکس پوستر فیلم هم توسط کتابخانه Picasso بارگذاری خواهد شد. دومین درخواست به بخش API سایت stackoverflow خواهد بود. در مثال دوم با استفاده از یک فرم یک سری پارامتر به API مورد نظر ارسال‌شده تا اطلاعات مربوط به سوال‌های پرسیده‌شده در این وب‌سایت دریافت شود. تعداد رکوردهای دریافت‌شده و عنوان اولین سوال نیز نمایش داده می‌شود.

سورس این برنامه در github قرار گرفته است، هرگونه pull request در جهت بهبود برنامه پذیرفته خواهد‌ شد.

برای injection کردن المان‌های صفحه از کتابخانه butterknife استفاده‌ شده‌است. برای توضیحات بیشتر در این مورد می‌تونید به مقاله‌ای از صمصام بابادی مراجعه کنید. همچنین برای توضیحات بیشتر نمایش عکس در ListView‌ با استفاده از Picasso به مقاله‌ای از طاها قاسمی مراجعه کنید.

ابتدا خطوط زیر رو به build.gradle‌ اضافه کنید:

منتظر باشید تا کار sync‌ کردن کتابخانه‌ها تموم بشه.
طراحی رابط‌کاربری بسیار ساده بوده و بیشتر به دریافت و نمایش اطلاعات توجه شده است. به دلیل‌اینکه کل سورس برنامه در دسترس هست از ذکر جزئیات خودداری می‌کنم. برای صفحه اصلی یا MainActivity دو المان Button قرار داده‌شده که با زدن هر کدام Activity‌ مربوطه نمایش داده می‌شه.

retrofitDemo_1

فایل json مربوط به اطلاعات فیلم

بخشی از اطلاعات ذخیره‌شده در این فایل به‌صورت زیر است:

یکی از توانایی‌های خوب Retrofit مپ‌کردن دیتای دریافتی بر روی کلاس‌های جاوا یا اصطلاحا POJO هست. این کار رو می‌شه با یکی از تبدیل‌کننده‌های رسمی همین کتابخانه به نام GsonConverter انجام داد. کتابخانه مورد نظر رو به gradle اضافه کردیم ولی ابتدا باید بتونیم کلاس POJO رو ایجاد‌ کنیم. این کار به راحتی توسط این وب‌سایت قابل انجام هست. متن فایل json مورد نظر رو کپی کنید و در این وب سایت قرار بدید، تنظیمات رو مطابق عکس زیر انجام بدید:
pojo

با زدن دکمه Preview کلاس POJO مربوط به این ساختار json ایجاد می‌شه. کلاس مورد نظر رو در پروژه با استفاده از همین نام تعریف شده در اینجا یعنی Movie ایجاد می‌کنیم.

آدرس API وب سایت stackoverflow بخش سوالات

بخشی از اطلاعات نمایش داده‌شده در این لینک به صورت زیر است:

برای به دست آوردن کلاس POJO این دیتا نیز به روش اشاره‌شده عمل می‌کنیم. تفاوتی که در این مثال با مثال قبل وجود داره اینه که فایل خروجی این دیتا خود شامل چندین کلاس است. یعنی برای مثال، کلاس اصلی یا Parent با نام Question نام‌گذاری شده است که در داخل اون لیستی از کلاس Item وجود داره. این لیست، شامل سوالاتی هست که پرسیده شده‌اند. در داخل کلاس Item کلاس دیگری تعریف شده به نام Owner که اطلاعات مربوط به کسی که سوال رو پرسیده در اون نگهداری می‌شه.
باید برای تمامی این کلاس‌ها به صورت جداگانه فایل جاوا ایجاد کرد و مقادیر ویژگی‌های اون‌ها رو وارد کرد. در ادامه خواهید دید که با استفاده از این تبدیل‌کننده، به راحتی و بدون درگیر شدن با ساختار پیچیده این داده‌ها می‌توان به تمامی اطلاعات دسترسی پیدا کرد.

بعد از ایجاد کلاس‌های POJO به سراغ کلاس تعریف توابع سرویس Retrofit خواهیم رفت. کلاس مورد نظر با نام APIService به صورت زیر ایجاد شده:

در این کلاس دو تابع به نام های getQuestionsService و getMovieService ایجاد شده‌اند. هر دو کلاس با استفاده از متد GET اطلاعات رو از سرور دریافت می‌کنن. در تابع مربوط به دریافت اطلاعات سوالات پرسیده‌شده در وب سایت stackoverflow تعدادی پارامتر ارسال می‌شوند. هر کدام از این پارامترها در داخل آدرس API ذکر شده وجود دارند و باید به همراه هر درخواست، این مقادیر ارسال شوند.

مقدار برگشتی تابع getMovieService لیستی از کلاس Movie خواهد بود. همچنین برای تابع دیگر، کلاس Question مقدار برگشتی خواهد بود که شامل لیستی از کلاس Item است. در این کلاس ویژگی‌های سوالات پرسیده‌شده قرار دارد.

با اضافه‌کردن این کلاس ساختار فایل‌های برنامه به صورت زیر خواهد بود:
ProjectExplorer

اکنون نوبت به پیاده‌سازی تابع دریافت‌کننده اطلاعات به صورت ناهمگام است. در فایل HiveActivity این تعریف به این صورت است:

در این تابع، GsonConverter به عنوان تبدیل‌کننده معرفی شده. همچنین baseUrl نیز با مقدار http://api.androidhive.info/json/ سرور دریافت اطلاعات را مشخص می‌کند. چنانچه دریافت اطلاعات با موفقیت انجام نشود در تابع ()response.errorBody خطای روی داده نمایش داده می‌شود. حتما برای کنترل مقادیر بازگشتی از این روش استفاده کنید.

لیست Movie‌ دریافت‌شده به بخش نمایش اطلاعات که CustomListAdapter نام دارد ارسال‌شده و سپس نمایش داده می‌شود. خروجی این بخش به صورت زیر خواهد بود:

retrofitDemo_2

تعریف تابع ناهمگام دریافت اطلاعات در فایل StackoverflowActivity به صورت زیر است:

تمامی روند کار همانند دریافت اطلاعات ذکر شده قبلی هست بجز فراخوانی تابع getQuestionsService که در آن مقادیر مورد نظر نیز به تابع ارسال می‌شوند. پس از دریافت اطلاعات تعداد آن‌ها نمایش داده شده و در صورتی که تعداد آن‌ها یک و بیشتر باشد، عنوان عنصر اول لیست Item یا سوال نیز نمایش داده می‌شود.
فرم دریافت اطلاعات به صورت زیر است که با مقادیر پیش فرض نمایش داده می‌شود:
retrofitDemo_3
پس از دریافت اطلاعات به صورت زیر نمایش داده می‌شود:
retrofitDemo_4

منابع: + +

بهروز خضری

کارهای خیلی زیادی انجام دادم توو برنامه‌نویسی ولی خیلی‌هاشون بی‌ثمر بودن برام. سه سالی است که برنامه‌نویسی اندروید انجام میدم. زمینه اصلی فعالیتم در‌ GIS و کار بر روی داده‌های مکانی در اندروید است.

همچنین ممکن است دوست داشته باشید ...

۱۳ واکنش

  1. مصطفی نصیری گفت:

    با تشکر از مقاله خوبت
    میشه لطف کنی یه مقایسه کوچیک بین retrofit و volley انجام بدی و تفاوت هاشون رو بگی؟

    • بهروز خضری گفت:

      من آشنایی زیادی با volley ندارم، تنها توو یکی از همین منابع دیدمش.
      اما مقایسه‌ای تقریبا یک ماه قبل روی این دوتا انجام شده که می‌تونید به این لینک مراجعه کنید:
      http://goo.gl/rgjifL
      توو stackoverflow‌ هم مباحثی گفته شده که می‌تونید این لینک رو ببینید:
      http://goo.gl/U8HP9

  2. علی گفت:

    سلام، می شه پروژه عملی این آموزش رو برای دانلود قرار بدین ؟
    ممنون

  3. ستار گفت:

    خیلی عالی بود جناب خضری – لطفا مقالات بیشتری از retrofti2 بزارید . خوشم اومده و اگه خدا بخواد تو پروژه هام از retrtofit استفاده میکنم . الانم که دیگه نسخه ۲ از بتا اومده بیرون.

    بازم ممنون – اجرکم من الله

  4. ستار گفت:

    سلام جناب خضری اگر امکان داره یه نمونه از ذخیره اطلاعات توسط retrofit 2 بزارید
    بنده دریافت اطلاعات رو تمرین کردم و خیلی عالی و خوب بود!
    ولی تو ارسال اطلاعات نتونستم منبع و نمونه خوبی پیدا کنم !
    اگر امکان داره یه نمونه ساده هم شده بزارین یا راهنمایی کنین !
    باز هم ممنون – من از مطالب سایتتون نهایت استفاده را دارم میبرم ! واقعا مدیونم بهتون!

  5. محمد گفت:

    سلام لطفا کار با retrofit رو با وب سرویس های جاوا و localhost آموزش بدین متشکرم

  6. علی زنده دل گفت:

    سلام استاد.
    خسته نباشید
    برای تبدیل یه جیسون ساده مثل زیر باید چه کلاس هایی داشته باشیم و برای دستور GET استفاده کرد.
    و سوال دوم اینکه چجوری میشه اطلاعات دریافتی از Object رو تو کلاس User ذخیره کنیم؟

    نمونه جیسون
    {
    “user”: {
    “id”: ۱۵۰,
    “name”: “test name”,
    “email”: “example@gmail.com”,
    “mobile”: “۰۹۳۶۰۳۹۸۰۰۶″,
    “type”: ۱
    }
    }

  7. محمود گفت:

    با سلام
    من از یه api یکسری دیتا دریافت میکنم و داخل یکی از آیتم های جیسون یک آدرس api دیگه هست که آدرس عکس ذخیره شده .باید اونو چطوری پیاده سازی کنم که آدرس عکسو دربیارم مخم دیگه ج نداد.
    واقعیتش با volley دو تا request فرستادم و آدرسو درآوردم ولی تو کلاس مدل ست نمیشه و nullه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *