باتوجه به اینکه در پروژههای قبلی با ارور anr مواجه نشدم علت استفاده از rx رو در پروژههای واقعی رو درک نکردم
ممنون میشم علت استفاده اش رو بیشتر توضیح بدید. چون حتی در پروژه لیست دانشجویان بدون استفاده از rx هم مشکلی وجود نداشت
سلام، درسته که RxJava میتونه جلوی ANR رو بگیره، ولی این فقط یه بخش کوچیک از قابلیتهاشه. در ادامه یک سری از مزایای استفاده از RxJava رو میارم و در نهایت مشخص میشه در چه کیسهای مناسب خواهد بود...
مدیریت عملیاتهای پیچیده: فرض کن داری یه اپ خبری میسازی. میخوای اخبار رو از چند تا منبع بگیری، فیلترشون کنی، مرتبشون کنی و نشون بدی. با RxJava این کار خیلی تمیز و مرتب میشه.
مدیریت عملیاتهای ناهمزمان: مثلاً میخوای هم از API داده بگیری، هم از دیتابیس محلی. با RxJava میتونی اینا رو باهم ترکیب کنی، بدون اینکه کدت شلوغ و در هم برهم بشه.
واکنش به تغییرات: فرض کن یه اپ نقشه داری، با RxJava میتونی خیلی راحت به تغییرات موقعیت کاربر واکنش نشون بدی، بدون اینکه نیاز باشه هی چک کنی.
کنسل کردن عملیاتها: یه وقتایی کاربر یه صفحه رو میبنده قبل از اینکه لود شه. با RxJava خیلی راحت میتونی عملیاتهای در حال انجام رو کنسل کنی.
تستپذیری بهتر: کدی که با RxJava نوشته میشه معمولاً راحتتر تست میشه. میتونی جریان دادهها رو شبیهسازی کنی و ببینی همه چی درست کار میکنه یا نه.
کد تمیزتر: با RxJava، کدت معمولاً تمیزتر و خواناتر میشه. به جای کلی callback تو در تو، یه جریان مرتب و منظم از عملیاتها داری.
حالا یه مثال عملی برات میارم:
جلوگیری از مشکلات آینده: حتی اگه الان با مشکلی مواجه نشدی، وقتی پروژت بزرگتر بشه یا نیاز به افزودن قابلیتهای بیشتر داشته باشی، ممکنه با مشکلاتی مثل مدیریت Threadها یا جلوگیری از Memory Leakها روبهرو بشی. RxJava ابزارهای خوبی برای مدیریت این موارد داره.
انعطافپذیری بیشتر: RxJava امکانات پیشرفتهای مثل ترکیب دادهها، فیلتر کردن، و تبدیل اونها رو فراهم میکنه که میتونی به راحتی جریانهای دادهت رو کنترل کنی.
حالا یه مثال عملی برات میارم:
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.schedulers.Schedulers
class NewsRepository {
fun getNews(): Observable<List<News>> {
return Observable.zip(
getLocalNews(),
getRemoteNews(),
{ local, remote ->
(local + remote).distinctBy { it.id }.sortedByDescending { it.date }
}
)
}
private fun getLocalNews(): Observable<List<News>> {
return Observable.fromCallable {
// فرض کنید این از دیتابیس محلی میخونه
listOf(News(1, "خبر محلی", "2024-09-16"))
}.subscribeOn(Schedulers.io())
}
private fun getRemoteNews(): Observable<List<News>> {
return Observable.fromCallable {
// فرض کنید این از API میخونه
listOf(News(2, "خبر آنلاین", "2024-09-17"))
}.subscribeOn(Schedulers.io())
}
}
// استفاده در ViewModel یا Activity
newsRepository.getNews()
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ newsList ->
// نمایش اخبار در UI
}, { error ->
// مدیریت خطا
})
تو این مثال: 1. داریم اخبار رو هم از منبع محلی و هم از API میگیریم. 2. این دو عملیات همزمان انجام میشن (بهینهسازی زمان). 3. نتایج رو ترکیب میکنیم، تکراریها رو حذف میکنیم و مرتب میکنیم. 4. همه اینها رو تو threadهای مناسب انجام میدیم بدون اینکه UI رو بلاک کنیم.