ارتباط با وب سرویس — ذخیره سازی اطلاعات در آندروید — Retrofit

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

HttpURLConnection

Apache HTTP client

مورد اول خیلی استفاده میشه ولی مورد دوم از نسخه ۶ آندروید دیگه حذف شده. علاوه بر این موارد پیاده سازی های دیگه از کتابخانه های مختلف جاوا برای آندروید وجود داره.

یه کتابخونه اپن سورس خیلی معروف هم هست که حتی خود آندروید هم از اون استفاده میکنه و احتمالن شما هم خواسته یا ناخواسته از اون استفاده میکنید. اکی اچ تی تی پی یه کلاینت برای اچ تی تی پی که امکانات خوبی واسه کش کردن و زمانبندی داره.

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

کتابخونه پیکاسو هم برای درخواست های وب ه ولی تمرکزشو گذاشته رو کار روی تصویر و دانلود اون و مدیریت حافظه و مسایل اون.

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

مرحله اول استفاده از رتروفیت قاعدتا اضافه کردن وابستگیش به پروژه ست.

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

تو این تنظیمات ما مبدل جیسون رو فقط اضافه کردیم. رتروفیت مبدل های دیگه ای هم مثل جکسون داره که اگه لازم دارید میتونید از اون هم استفاده کنید.

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

interface UsersList { 
    @GET("users")
    fun getUsers(): Call<User>
}

مرحله دوم تنظیم و ایجاد یک نمونه از سرویسه

class ServiceBuilder{
    companion object {
        private val baseUrl = "http://10.0.2.2:9000"
        private val builder = Retrofit.Builder().baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())

        private val retrofit = builder.build()

        fun <S> buildService (serviceType: Class<S>):S{
            return retrofit.create(serviceType)
        }

    }
}
val  taskService= ServiceBuilder.buildService(UsersList::class.java)
val call = taskService.getUsers()

call.enqueue(object : Callback<User>{
    override fun onResponse(call: Call<User>?, response: Response<User>?) {
        //
    }

    override fun onFailure(call: Call<User>?, t: Throwable?) {
        //
    }

})

یکی از ویژگی های این روش اینه خود رتروفیت مدیریت همزمانی درخواست رو کنترل میکنه که مساله مهمی در برنامه نویسی آندرویده