Notice: Constant DISALLOW_FILE_EDIT already defined in /home/nouriin/public_html/wp-config.php on line 107
4 ترفند طلایی هنگام استفاده کردن از RxJava | محمد نوری | برنامه نویس و مدرس اندروید

4 ترفند طلایی هنگام استفاده کردن از RxJava

rxjava-important-useful-tips
اندروید

4 ترفند طلایی هنگام استفاده کردن از RxJava

احتمالا تا الان اسم RxJava به گوشتون خورده باشه.

کتابخونه‌ای که برنامه ‌نویسی اندروید رو یه جورایی متحول کرد.

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

یا حتی درک درستی نسبت به مفاهیم جریان داده (Data Stream) ندارن!

rxjava-important-useful-tips

چرا RxJava مهمه ؟

عملگرهای (Operators) RxJava فوق‌العاده قدرتمند هستن و واقعا کمک های خیلی زیادی میتونه بهمون بکنه.

حتی بعضی از مواقع اگه از RxJava استفاده نکنیم، برای پیاده‌سازی بعضی از کارها باید ساعت‌ها زمان بذاریم و ده‌ها خط کد بنویسیم.

توی این پست میخوام 4 ترفند مهم و طلایی رو بهتون یاد بدم.

با این ترفندها می‌تونی از شر کلی کدهای اضافه و پیچیده راحت بشی😉

1) ترکیب کردن 2 جریان با همدیگه

اجازه بدید این موضوع رو با یک مثال توضیح بدم.

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

مثلا : ما یک صفحه‌ای داریم و باید توی این صفحه به 2 تا endpoint درخواست بدیم و اطلاعاتشون رو دریافت کنیم.

یکی از این endpointها برای دریافت پست‌های کاربر یکی دیگه هم برای دریافت پست‌های سایت هستش.

ولی این 2 باید همزمان باهم نشون داده بشن، نه اینکه اول اطلاعات یکی رو بارگذاری کنه و بعدش اطلاعات یه endpoint دیگه رو بارگذاری کنه.

اطلاعات هر دو endpoint باید همزمان باهم نشون داده بشن.

فرضا endpointهای ما به شکل زیر هستن

@GET("myposts")
fun getMyPosts(): Single<MutableList<Post>>

@GET("posts")
fun getSitePosts(): Single<MutableList<Post>>

همانطور که می‌بینید من اطلاعات رو باید از دو endpoint مختلف بگیرم.

اینکه بخوام خودم دستی اینارو کنترل کنم که همزمان باهم نشون داده بشن باید یکسری کدهای نسبتا پیچیده‌ای رو بنویسم که بتونم بین 2 تا endpoint اون ارتباط رو برقرار کنم.

طبیعتا هرچقدر پیچیدگی پروژه بیشتر باشه، همون قدر نگه‌داری پروژه سخت‌تر خواهد بود.

RxJava یه راه‌حل خوب برای اینکار معرفی کرده.

استفاده کردن از اپراتور zipWith هستش.

api.getSitePosts()
        .zipWith(api.getMyPosts(), BiFunction<MutableList<Post>, MutableList<Post>, MutableList<Post>> { t1, t2 ->
            mutableListOf<Post>().apply {
                addAll(t1)
                addAll(t2)
            }
        })
        .subscribe({
            // درصورت دریافت اطلاعات، کدها رو اینجا می‌نویسیم
        }, {
            // نمایش خطا
        })

همانطور که می‌بینید من یکی از endpointها رو نوشتم و endpoint بعدی رو هم توسط zipWith دریافت کردم.

زمانی که دریافت اطلاعات هردو endpoint به پایان رسید، میتونم توی subscribe کدهای خودم رو بنویسم.

به همین راحتی😎

2) کنترل سرعت ارسال اطلاعات

شاید توی اپلیکیشن‌هایی که بخش جستجو دارن، دیدین که با ارسال حروف نتیجه جدیدی از جستجو رو بهتون نشون میده.

مثلا : یک کادر جستجویی دارید و با هر حروفی که کاربر وارد میکنه اون کلمه رو سمت سرور ارسال می‌کنید و از سمت سرور هم نتیجه جدیدی رو دریافت می‌کنید.

ولی اینکه بخواید مدام با هر تغییری این اطلاعات رو سمت سرور ارسال کنید، اصلا کار خوبی نیستش.

باید یک زمان تاخیری رو در نظر بگیرید.

مثلا بگید که اگه از زمان آخرین حروف وارد شده، 500ms (میلی‌ثانیه) گذشت بعد اون کلمه رو سمت سرور ارسال کن.

به صورت عادی اگه بخواین خودتون این قابلیت رو پیاده‌سازی کنید باید از روش‌هایی مثل : TimerSleep thread و … استفاده کنید که بازم باید کلی کد بزنید و کارتون پیچیده‌تر میشه.

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

این اپراتور بهتون کمک می‌کنه که برای انجام عملیات مختلف یک تاخیری رو درنظر بگیرید.

typingObservable.debounce(500, TimeUnit.MILLISECONDS)
.subscribe { 
    // انجام عملیات موردنظر بعد از گذشت 500 میلی‌ثانیه
}

3) ساخت جریان‌های مخصوص به خودمون

راستش خیلی کم پیش میاد که بخوایم یه جریان (Observable) اختصاصی واسه خودمون داشته باشیم.

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

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

چه زمان‌هایی؟

زمان‌هایی که فرضا عملیات خیلی سنگینی رو قرار توی ترد پس‌زمینه (background thread) انجام بدیم.

Flowable.create<String>({ e ->
    // نوشتن کدهای سنگینی که در ترد پس‌زمینه اجرا میشن
}, BackpressureStrategy.DROP)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
     .subscribe {
            // نمایش نتیجه دریافتی در ترد UI
        }
subscribeOn(Schedulers.io()) : انجام عملیات در ترد پس‌زمینه

observeOn(AndroidSchedulers.mainThread()) : دریافت نتیجه عملیات در ترد اصلی

4) ارتباط بین تردها

یک موضوعی که هنگام کار با RxJava بارها اتفاق میافته، ارتباط بین ترد پس‌زمینه و ترد اصلی هستش.

پس چقدر بهتر میشه که برای اینکار یک تکه کدی بنویسیم و مدام ازش استفاده کنیم.

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

برای اینکار من از کد زیر استفاده می‌کنم

fun <T> Single<T>.applyScheduler(scheduler: Scheduler) =
    subscribeOn(scheduler).observeOn(AndroidSchedulers.mainThread())

fun <T> Single<T>.applyIoScheduler() = applyScheduler(Schedulers.io())

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

ApiClient.getInstance().apisUseCase()
                .getRegisterUser(auth)
                .applyIoScheduler()
                .subscribe({ response ->
             // محل نوشتن کدهای اصلی
        }, { error ->
                    //محل هندل کردن ارور
                })

 

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

 

راستی، من یک دوره‌ای رو درست کردم که به رایگان برنامه‌نویسی کاتلین رو بهت آموزش میدم.

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

اگه به این زبان برنامه‌نویسی علاقه داری میتونی توی این دوره توسط بخش زیر به رایگان ثبت‌نام کنی.

ثبت‌نام رایگان در دوره کاتلین
رایگان

دوره مقدماتی کاتلین برای برنامه نویسان اندروید

4.5/5
(4 امتیاز)
20 درس
مبتدی
آنچه یاد خواهید گرفت
آموزش از صفر برنامه نویسی کاتلین

دیدگاه خود را اینجا قرار دهید

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

فیلدهای نمایش داده شده را انتخاب کنید. دیگران مخفی خواهند شد. برای تنظیم مجدد سفارش ، بکشید و رها کنید.
  • عکس
  • شناسه محصول
  • امتیاز
  • قیمت
  • در انبار
  • موجودی
  • افزودن به سبد خرید
  • توضیحات
  • محتوا
  • عرض
  • اندازه
  • تنظیمات بیشتر
  • ویژگی ها
  • Custom attributes
  • زمینه های دلخواه
مقایسه
لیست علاقه مندی ها 0