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

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

در این مقاله سرفصل های زیر بررسی میشوند:
چگونه کتابخانه را به اندروید استودیو اضافه کنیم؟
Retrofit
Moshi
Chuck
Universal Image Loader
Glide
ThreeTen
Timbler
GSON
Room
ActiveAndroid
EventBus
RxJava
Android KTX
Dagger
جمع بندی
نظر شما چیست؟


چگونه کتابخانه را به اندروید استودیو اضافه کنیم؟

کتابخانه های خوب و متن باز میتوانند برنامه نویسی را برای شما بسیار آسان تر و سریعتر کنند. لایبرری های معروف هم معمولا به خوبی تست شده اند و استفاده از آنها راحت است. در بسیاری از موارد شما میتوانید این کتابخانه ها را با استفاده از Maven به پروژه اندروید استودیو خودتان اضافه کنید. برای اضافه کردن آنها میتوانید از روش زیر بهره بگیرید: (این کد ها باید در فایل build.gradle سطح اپ، درون dependencies نوشته بشوند).

dependencies {
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.squareup.okhttp:okhttp:1.3.0'
    compile 'com.squareup.retrofit:retrofit:1.3.0'
    compile 'de.greenrobot:eventbus:2.2.+'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.1'
}

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


Retrofit

کتابخانه اندروید retrofit

Retrofit یکی از کلاینت های ایمن HTTP است که به شما اجازه میدهد REST API خودتان را به عنوان یک اینترفیس تعریف کنید. شما میتوانید با استفاده از این کتابخانه بدنه درخواست ها (Query ها)، هدر ها، پارامتر های کوئری و بسیاری کارهای بیشتر را انجام بدهید. همه این کار ها با استفاده از Annotation ها انجام میشوند که باعث میشود همه چیز ساده و تر و تمیز باقی بماند. همچنین Retrofit به شما اجازه میدهد که بتوانید فراخوانی های API را بصورت همزمان و غیر همزمان (سنکرون و آسنکرون) اجرا کنید.

interface ApiService {
  @GET("movie/{id}")
  fun getMovieDetails(@Path("id") id: String) : Call<MovieDetails>
}

به عنوان نکته آخر، باید بگوییم Retrofit یک ماژول RX جداگانه را برای شما مهیا میکند. یعنی اگر دارید از RX استفاده میکنید، این ماژول درخواست های API شما را به عنوان یک Observable برمیگرداند. بنابراین میتوانید آن را به بقیه اپلیکیشن خودتان متصل کنید. این یکی از هزاران دلیلی است که Retrofit یکی از بهریت کتابخانه های اندروید است و ما آن را دوست داریم و هنوز هم از آن استفاده میکنیم.


Moshi

moshi کتابخانه اندروید

Moshi یکی از بهترین کتابخانه های اندروید است. این لایبرری میتواند JSON را به مدل های جاوا و کاتلین تبدیل کند. بسیاری از مردم به این کتابخانه GSON 3.0 هم میگویند. این لایبرری در بسیاری از قسمت ها به GSON برتری دارد. اول: سریعتر است، از کاتلین پشتیبانی میکند، برای توسعه پایدار تر است، Exeption های قابل پیش بینی ایجاد میکند و از آداپتور شکست خورده DateTime بصورت پیشفرض استفاده نمیکند. علاوه بر همه اینها، تبدیل JSON به جاوا (و برعکس آن) با Moshi بسیار ساده است.

val moshi = Moshi.Builder().build()
val jsonAdapter = moshi.adapter(Model::class.java)

/* JSON to Model */
val model = jsonAdapter.fromJson(json)

/* Model to JSON */
val json = jsonAdapter.toJson(model)

همچنین ما Moshi را به خاطر پشتیبانی آن از JSON API دوست داریم. MOSHI JSON API زندگی را برای ما آسان تر میکند. زیرا میتواند پاسخ های JSON API را به آبجکت های مفهوم دار جاوا تبدیل کد. Retrofit میتواند از Moshi پشتیبانی کند و همه اینها بایکدیگر کار میکنند.


Chuck

Chuck یک بازرس HTTP برای اندروید است که به شما اجازه میدهد تاریخچه HTTP اپلیکیشن خودتان را روی موبایلتان ببینید. Log مخصوص به HTTP برای شما به عنوان یک ناتیفیکیشن نمایش داده خواهد شد و اگر بخواهید آن را بصورت کامل در رابط کاربری Chuck ببینید میتوانید آن را از قسمت اعلان ها لمس کنید. اگر از Chuck استفاده کنید تیم کنترل کیفیت شما خیلی تشکر خواهد کرد. زیرا از این طریق میتوانند بفهمند که آیا یک مشکل سمت اندروید است یا قسمت Backend آن؟ این لایبرری که یکی از بهترین کتابخانه های اندروید است، گاهی خیلی بیشتر از logcat میتواند کاربردی باشد. زیرا حتی اگر اپلیکیشن شما هم متوقف شده باشد، باز هم تاریخچه HTTP باقی خواهد ماند. در حالیکه logcat گاهی بعد از ریستارت شدن اپلیکیشن محتویات خودش را پاک میکند.


Universal Image Loader

UIL یکی از بهترین کتابخانه های اندروید است که با استفاده از آن میتوانید لود کردن و cache کردن عکس ها به صورت غیر همزمان (آسنکرون) استفاده میشود. استفاده کردن از آن هم تقریبا ساده است:

imageLoader.displayImage(imageUri, imageView);

البته Picasso از API بهتری برخوردار است، ما در شخصی سازی کمی لنگ میزند. با استفاده از گزینه های ساخت و پیکربندی UIL تقریبا میتوانید هرکاری انجام بدهید. (این مورد درباره استفاده از تصاویر بزرگ به کار می آید، چیزی که Picasso نمیتواند آن را انجام بدهد).


Glide

کتابخانه اندروید glide

همانطوری که شاید تا الان متوجه شده باشید، API مربوط به لود کردن و مدیریت عکس ها در اندروید افتضاح است. اینکه بتوانید یک عکس را تغییر سایز بدهید و خطای OutOfMemoryException را نبینید، بیشتر شبیه یک رویا میماند. Glide یکی از بهترین کتابخانه های اندروید است که مخصوص کار با تصاویر میباشد. همچنین یک API خیلی خوب دارد و میتوانید با استفاده از آن هرکاری که میخواهید با تصاویر انجام بدهید.

GlideApp.with(context)
  .load(url)
  .centerCrop()
  .placeholder(R.drawable.ic_placeholder)
  .into(imageView)

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


ThreeTen

threeten کتابخانه اندروید

ThreeTen یکی از بهترین کتابخانه های اندروید برای مدیریت تاریخ و زمان است. این کتابخانه به نوعی مدل پیشرفته تر و بهبود یافته تر از JSR-310 میباشد که در Java 8 به عنوان به صورت استاندارد به عنوان پکیج java.time.* وجود داشت. ما این لایبرری را دوست داریم به خاطر اینکه کار کردن با Android Calendar API مثل یک کابوس میماند.

/* Current DateTime */
LocalDateTime.now()

/* String to DateTime */
val localDateTimeString = "2011-12-03T10:15:30"
val localDateTime = LocalDateTime.parse(localDateTimeString)

ThreeTen از لحاظ تعداد متد ها و حجم بسیار کوچکتر از JodaTime میباشد. API آن هم بسیار خلاصه تر از JodaTime است. اگر الان دارید از JodaTime استفاده میکنید، شاید ارزش نداشته باشد که بخواهید ThreeTen را جایگزین آن نمایید. اما اگر میخواهید یک پروژه جدید را شروع کنید، شدیدا به شما پیشنهاد میکنم از ThreeTen استفاده بکنید.


Timber

Timber یکی از بهترین کتابخانه های اندروید برای Log های اندروید است که بر اساس کلاس Log ساخته شده است. این لایبرری قدیمی و قدرتمند به شما اجازه میدهد قابلیت لاگ را خاموش یا روشن کنید. همچنین این مورد میتواند از لاگ کردن رشته های قالب بندی شده و Exception ها پشتیبانی بکند. بخاطر این ویژگی ها، Timber یکی از بهترین کتابخانه های اندروید است که ما در اکثر پروژه های خودمان از آن استفاده میکنیم.

[java]
/* Log error */
Timber.e("Error happened")

/* Log warning with params */
Timber.w("Your variable value is %s", variable)

/* Log exception */
try {
  ...
} catch (e: Exception) {
  Timber.e(e)
}

GSON

GSON یکی از بهترین کتابخانه های اندروید است که برای Serialized کردن آبجکت های جاوا به JSON و Deserialized کردن آنها از JSON به جاوا استفاده میشود. (Serialize کردن یعنی تبدیل داده ها به یک جریان از بیت ها که مثل رودخانه میتوانید آن را در نظر بگیرید. در این جریان، بیت ها یکی یکی پشت سر هم قرار میگیرند و یک دنباله را تشکیل میدهند). وقتی که با API ها کار میکنید دائما نیاز دارید که این عمل انجام بشود. ما به این دلیل بیشتر از JSON استفاده میکنیم که سبک تر و بسیار ساده تر از XML است.

// Serialize
String userJSON = new Gson().toJson(user);

// Deserialize
User user = new Gson().fromJson(userJSON, User.class);

همچنین این لایبرری میتواند هماهنگی خوبی با Retrofit داشته باشد.


Room

room کتابخانه اندروید

Room یک Android ORM رسمی است. (یعنی یک تکنیک برنامه نویسی که با استفاده از زبان های شی گرا بین دو نوع مختلف از سیستم ارتباط برقرار میکند). دلایل زیادی هم برای این قضیه وجود دارد. این لایبرری یک API زیبا دارد که مانند Retrofit است. همچنین استفاده بسیار زیادی از annotation ها و سینتکس استاندارد SQL کرده است.

@Dao
interface MovieDao {
  @Query("SELECT details FROM movies WHERE id = :id")
  fun getMovieDetails(id: String): MovieDetails
}

علاوه بر همه اینها، Room بصورت اضافه از RX و LiveData هم پشتیبانی میکند، پس میتوانید اگر خواستید از آنها هم استفاده کنید. ویژگی اصلی Room نسبت به دیگر ORM ها سادگی آن است. بقیه ORM ها با API بسیار پیچیده تری عرضه میشوند که شما باید قبل از استفاده کل documentation آن را مطالعه نمایید تا بتوانید از آن استفاده کنید. به دلیل سینتکس استاندارد SQL آن، فهمیدن این لایبرری بسیار ساده است. همین به شما اجازه میدهد بدون تلف کردن زمان زیادی برای خواندن داکیومنتیشن، کارهای خودتان را انجام بدهید.


ActiveAndroid

ActiveAndroid یکی از کتابخانه های ORM برای اندروید است. در حقیقت یک لایه انتزاعی (abstraction) روی SQLite است که به شما اجازه میدهد با یک دیتابیس روی یک دستگاه ارتباط برقرار کنید بدون اینکه دستورات SQL بنویسید. آبجکتی که ActiveAndroid را extend میکند به این صورت میتواند در پایگاه داده ذخیره بشود:

user.save();

که این کد میتواند جایگزین یک دستور بزرگ SQL مانند زیر بشود:

INSERT INTO Users (Nickname, Name, Address, City, PostalCode, Country) VALUES ('Batman','Bruce W','Palisades 21','Gotham','40000','USA');

در اینجا یک دستور دیگر را میبینید که همه کاربران را به ما برمیگرداند:

List<User> users = new Select().from(User.class).execute();

که مثال آن در دستورات SQL مانند این میشود:

SELECT Nickname, Name, Address, City, PostalCode, Country FROM Users;

ActiveAndroid یکی از بهترین کتابخانه های اندروید و یک راه خوب برای دوری کردن از کدهای به هم ریخته است که برای کارکردن با دیتابیس ها به کار میرود. همچنین راه حل های متن باز دیگری مانند GreenDAO و ORMLite استفاده کنید.


EventBus

کتابخانه اندروید eventbus

EventBus یکی از بهترین کتابخانه های اندروید است که ارتباط بین قسمت های مختلف اپلیکیشن شما ساده سازی میکند. به عنوان مثال، فرستادن چیزی از یک اکتیویتی به یک سرویس در حال اجرا، یا تراکنش های آسان بین فرگمنت ها. در اینجا یک مثال را میبینید که ما برای زمانی که ارتباط با اینترنت از دست میرود از آن استفاده میکنیم، و نشان میدهد که چگونه یک اکتیویتی را با خبر کنیم:

public class NetworkStateReceiver extends BroadcastReceiver {

    // post event if there is no Internet connection
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        if(intent.getExtras()!=null) {
            NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
            if(ni!=null &amp;&amp; ni.getState()==NetworkInfo.State.CONNECTED) {
                // there is Internet connection
            } else if(intent
                .getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
                // no Internet connection, send network state changed
                EventBus.getDefault().post(new NetworkStateChanged(false));
            }
}

// event
public class NetworkStateChanged {

    private mIsInternetConnected;

    public NetworkStateChanged(boolean isInternetConnected) {
        this.mIsInternetConnected = isInternetConnected;
    }

    public boolean isInternetConnected() {
        return this.mIsInternetConnected;
    }
}

public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EventBus.getDefault().register(this); // register EventBus
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this); // unregister EventBus
    }

    // method that will be called when someone posts an event NetworkStateChanged
    public void onEventMainThread(NetworkStateChanged event) {
        if (!event.isInternetConnected()) {
            Toast.makeText(this, "No Internet connection!", Toast.LENGTH_SHORT).show();
        }
    }

}

RxJava

RxJava یک Implementation جاوا از ReactiveX API است که به شما اجازه میدهد وظیفه ها (Task ها) و ایونت های غیر همزمان (آسنکرون) را در یک دنباله قابل مشاهده قرار بدهید. کاربران از اپلیکیشن های مدرن انتظار دارند که داده ها را بصورت real-time یا بدون تاخیر نشان بدهند. به زبان ساده تر، آنها میخواهند داده ها بصورت خودکار به روز رسانی بشوند. اینجا جایی است که RxJava وارد عمل میشود.

rxjava کتابخانه اندروید

وقتی که میخواهید داده ها را به صورت real-time درخواست کنید، ادغام کردن چندین فراخوانی API، عوض کردن Thread ها و مدیریت خطاها کار بسیار مشکلی است. در این زمینه RxJava میتواند خودی نشان بدهد و به همین دلیل است که ما استفاده از این لایبرری را شروع کرده ایم. باید اعتراف کنم که یاد گرفتن و استفاده کردن از RxJava مشکل و کمی گیج کننده است، اما کاملا ارزش زمانی که برای آن صرف میکنید را دارد. حتی زمانی که از کاتلین استفاده میکنید، باز هم میتوانید به خاطر منفعت های RxJava، هنوز هم از آن استفاده کنید. حتی عملکرد API آن با استفاده از کاتلین بهتر میشود و این بخاطر عملکرد افزون های جانبی آن است.

Single.zip(
  /* Execute first API call and retry twice if it fails */
  apiService.getMovieActors(id).retry(2),
  /* Execute second API call and retry twice if it fails */
  apiService.getMovieDetails(id).retry(2),
  /* Receive successful results and merge them into single model */
  BiFunction<List<Actor>, MovieDetails, Movie> { actors, details -> Movie(details, actors) }
)
  /* Execute API calls on IO thread */
  .subscribeOn(Schedulers.io())
  /* Receive results on MainThread */
  .observeOn(AndroidSchedulers.mainThread())
  .subscribeBy(
    onError = { /* Handle error */ },
    onSuccess = { /* Handle full movie data */ }
  )

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


Android KTX

Android KTX یک مجموعه از افزونه های کاتلین است که میتواند API جاوا را بسیار کاربرپسند تر کند. همه هدف این لایبرری این بوده که استفاده از Android API را برای شما خوشایند تر بکند. این لایبرری میتواند بسیاری از متدها و ویژگی های جدید باحال کاتلین مانند name paramaters، lambdas و default parameter values را به پروژه شما اضافه بکند.

/* Display View */
view.isVisible = true

/* Apply padding to all sides */
view.setPadding(padding)

/* Update padding on any side */
view.updatePadding(left = newPadding, right = newPadding)

/* Quick Toast */
toast("Display test toast")

/* New way to create bundle */
bundleOf {
  "key1" to item1
  "key2" to item2
}

/* Better way to use SharedPreferences */
sharedPreferences.edit {
  putString("key1", "value1")
  putString("key2", "value2")
}

Android KTX یکی از بهترین کتابخانه های اندروید است و شامل بسیاری از افزونه های کاربردی است و تنها راه برای اینکه بفهمید چگونه کار میکند این است که کدهای آن را نگاه کنید تا متوجه بشوید از چه راهی Android API را تقویت کرده اند. این لایبرری نحوه استفاده ما از Android API را تغییر میدهد، و به همین دلیل باید به عنوان هسته اصلی هر پروژه ای که به زبان کاتلین نوشته شده است قرار بگیرد.


Dagger

بدون Dagger لیست بهترین کتابخانه های اندروید ناکامل میماند. Dagger یک فریم ورک استاتیک و compile-time dependency Injection است. مانند RxJava، کار کردن و فهمیدن Dagger هم مشکل است، اما این مورد هم ارزش زمانی که برای آن صرف میکنید را دارد.

Dependency Injection یک روش است که در آن اجزای کوچک از یک مدل را فراهم میکنیم و سپس آنها را با کمترین تلاش به هم میچسبانیم. به عنوان مثال، اگر یک مدل ماشین داشته باشید، شما میتوانید برای آن لاستیک هایی تهیه کنید و بعدا به راحتی این لاستیک ها را عوض کنید، بدون اینکه مجبور باشید حتی به چیز دیگری در مدل ماشین خودتان دست بزنید.

dagger کتابخانه اندروید

وقتی که با پروژه های بزرگ سر و کله میزنید، اصلا دلتان نمیخواهد Dependency Injection را خودتان مدیریت کنید. زیرا کد ها به شدت سریع رشد میکنند و بزرگ میشوند و کنترل کردن آنها سخت است. Dagger به شما کمک میکند از این شرایط دور بمانید، زیرا کار خودش را در زمان کامپایل شدن برنامه با استفاده از پردازش annotation ها انجام میدهد.

در سال گذشته، گوگل همچنین یک ماژول جداگانه به نام Dagger Android را ساخته است، که به شما اجازه میدهد کدهای مدیریت شده و مرتب بیشتری بنویسید و Inject Dependency راحت تر انجام بشود.


جمع بندی

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


نظر شما چیست؟

شما هم اگر تجربه برنامه نویسی اندروید رو داشته باشین حتما از لایبرری های اندروید استفاده کردین. اگر کتابخونه خوبی رو میشناسین که توی این لیست قرار نداره، میتونین با ثبت نظر و تجربه خودتون در قسمت نظرات (همین پایین) به ما در کامل تر شدن این مقاله کمک کنید.

دیدگاه‌ خود را بنویسید

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

اسکرول به بالا