عاشقانه‌ای برای ارتباط با سرور در اندروید!


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

همچنین در این نوشته با یک کتابخانه قدرتمند برای ارتباط با سرور در اندروید آشنا می شوید که منظورم نه Google Volley است و نه Retrofit ، در نتیجه اگر توسعه‌دهنده اپلیکیشن اندروید نیستید این نوشته به درد شما نمی‌خورد.


تا مدتی قبل یکی از ترسناک ترین بخش های توسعه اپلیکیشن اندروید، ارتباط با سرور بود که برای هر درخواستی به سرور باید از یک HttpClient استفاده می‌کردیم.

من از دوسال پیش که سمت اندروید رفتم همواره برای یادگیری ارتباط با سرور اهمال کاری میکردم، یک اهمال کاری که ریشه ی آن ترس بود. ترس از سختی.

اما در این ترم در دانشگاه اتفاقی افتاد که باعث شد مجبور شوم آن را یاد بگیرم. داستان از این قرار بود که یکی از اساتید دانشگاه که ترم های قبل با ایشان چندین درس را گذرانده بودیم و هیچ علاقه ای برای تعریف پروژه پایانی برای درس نداشتند، در دومین جلسه کلاس در یک حرکت ضربتی، ناگاه و در چرخشی ۱۸۰ درجه،‌ گذراندن درس را منوط به تحویل پروژه دانستند.

بعد از پایان این کلاس،‌ عملا ما از تعجب شاخ درآورده بودیم. بعضی‌ها خوشحال و بعضی‌ها ناراحت. من به شخصه جزء دسته‌ی خوشحال‌ها بودم. چون تجربه به من ثابت کرده که تا برای درسی پروژه تعیین نشود، من به سراغ یادگیری موضوعات جدید نخواهم رفت. با خودم گفتم پس مجبورم ارتباط با سرور را یاد بگیرم. (‌حتما برایتان سوال پیش می‌آید که: حتما باید زور بالا سرت باشه تا یه کاری رو انجام بدی؟ جواب مثبته.)

به هر حال این پروژه باعث انگیزه‌ای برای یادگیری ارتباط با سرور در اندروید شد و بالاخره رفتم که قورباغه ام ( چرا غورباقه نه؟) را قورت بدهم.

اولین تلاش: HttpClient

می توانم بگویم این روش سخت ترین روش ارتباط با سرور است. چون باید همه چیز توسط خودمان هندل شود. بعد از چندین‌و‌چند روز درگیری و مشکلات متعدد توانستم با این روش از سرور اطلاعاتی را به صورت json بگیرم. عیب این روش کدهای طولانی به درد نخور است که از لحاظ تکنیکی تقریبا چیز خاصی به ما یاد نمی دهد.

بخش ارتباط با سرور پروژه با این که راه افتاده بود اما اصلا نسبت به آن حس خوبی نداشتم و نتیجه این شد که دنبال کتابخانه‌ای بگردم تا این کار را برایم راحت‌تر کند.

دومین تلاش:

از آنجا که قرار شد از کتابخانه های آماده استفاده کنم،‌ به دنبال کتابخانه هایی که این کار را انجام میدادند، گشتم. فکر میکردم 2 گزینه پیش رو دارم: 1- Google Volley و 2- Retrofit

راجع به این دو زیاد شنیده بودم. بنابراین از Volley شروع کردم. انصافا نسبت به روش اول خیلی راحت‌تر و قابل فهم‌تر بود. اما بازهم حس خوبی نسبت به آن نداشتم. به سراغ Retrofit رفتم، تجربه بهتری از Volley بود اما یک مشکل داشت: عدم پشتیبانی از کش به صورت خودکار.

سومین تلاش:

در ادامه کمی سرچ کردم، به این صفحه رسیدم.

عاشقش شدم ?

به اندازه ای از کار با این کتابخانه لذت بردم که دوست دارم تمام برنامه‌هایی که می‌نویسم را آنلاین کنم.

این کتابخانه Fast Android Networking نام دارد. شاید میشد در انتخاب نامش بیشتر تامل می‌کردند. در هر صورت این کتابخانه از OkHttp استفاده می‌کند و در کنار استفاده خیلی آسانش، تقریبا تمام ویژگی‌های دو کتابخانه قبلی را دارد.

چگونه از آن استفاده کنیم؟

با این که در صفحه github این کتابخانه توضیحات کاملی داده شده است، من یک توضیح کلی می‌دهم.

1- ابتدا باید کتابخانه را از طریق gradle به پروژه اضافه کنیم، این خط را به dependencies در build.gradle ماژول app اضافه کنید:

implementation 'com.amitshekhar.android:android-networking:1.0.2' 

نکته: برخلاف Retrofit نیاز نیست که کتابخانه gson برای کار با json را اضافه کنیم و خود این کتابخانه به صورت پیشفرض از gson استفاده می‌کند.

2- دسترسی اینترنت را از طریق manifest به برنامه بدهید:

<uses-permission android:name="android.permission.INTERNET" />

3- در این مرحله باید یک کلاس بسازیم که از کلاس Application ارث بری کند و در متد onCreate این کلاس، کتابخانه را initialize را کنیم. پس یک کلاس با نام دلخواه بسازید و در متد onCreate آن این خط را اضافه کنید:

AndroidNetworking.initialize(getApplicationContext());

نکته: می‌دانید که هر کلاسی که از کلاس Application ارث بری کند باید در manifest معرفی شود. پس این کار را انجام دهید.

کار تمام است. دیگر میتوانیم از این کتابخانه در هر جای پروژه که خواستیم استفاده کنیم.

به طور مثال در متد onCreate اکتیویتی Main می‌نویسیم:

AndroidNetworking.get("آدرس مورد نظر شما")
          .build()
          .getAsJSONArray(new JSONArrayRequestListener() {
                    @Override
                    public void onResponse(JSONArray response) {
                              // do anything with response
                    }
                    @Override
                    public void onError(ANError error) {
                              // handle error
                    }
});

تمام. درصورت عدم بروز خطا، اطلاعات به صورت آرایه‌ای از json ها دریافت می‌شود و می‌توانید هرکاری که خواستید با آن انجام دهید.

این ساده‌ترین حالت استفاده از این کتابخانه ساده و قوی است که یک درخواست get به سرور ارسال کردیم.

همچین این کتابخانه یک کنترل با نام ANImageView دارد که میتوان با آن تصاویر را به راحتی از سرور دریافت و نمایش داد و عملا دیگر نیازی به کتابخانه‌های picasso و یا glide نیست.

پیشنهاد می‌دهم از این کتابخانه استفاده کنید، عاشقش می‌شوید.