مهدی معروف به سقراط مناطق محروم :)
مهدی معروف به سقراط مناطق محروم :)
خواندن ۵ دقیقه·۳ سال پیش

پردازش غیر همزمان با RxAndroid



مقدمه جذاب !

معمولا مردم مقدمه نمی خونن ! اما سعی می کنم ساده و خلاصه بگم ، پس با من همراه باشید

خوب برای توضیح دوست عزیزمون (RxJava) باید کمی براتون از سخت افزار بگم ! فرض کنید میخواهید یک فیل رو بخورید چطور این کار رو میکنید ؟! خوب جوابش سادست ! لقمه لقمه

خوب چه ربطی داشت !!! ربطش این جاست که اگه کامپیوتر شما بخواد یک کار سنگین رو انجام بده باید چطور انجام بده؟ اول باید اون رو به قسمت های کوچک تر تبدیل کنه و اون ها رو انجام بده ، چرا ؟!

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

خوب ما توی کامپیوتر برای برنامه ای یک پردازش (process) داریم که اون ها هم واسه خودشون یک id دارن و اگه در سیستم های لینوکسی هستید همین الان برید و دستور "top" رو در کامند لاین تون بنویسید تا به صورت لحظه ای بتونید پراسس های کامپیوتر تون رو ببینید (حتی با گوشی های اندروید هم میشه بالاخره اون ها هم کامپیوتر هستند) دوستای ویندوزیمون هم میتونن "tasklist" این رو در کامند لاین شون بزنن

و حالا با یک سری چیز ها این کار ها باید پردازش بشن !

اما مشکل این جاست که مثلا اگه مرور گر شما نیاز به پردازش داشته باشه بقیه باید صبر کنن تا کارش تموم شه ! اما من میخوام همزمان یک سری کار رو انجام بدم ، باید چی کار کنم !! خوب باید با یک سری روش پردازنده (cpu) رو در اختیار همه قرار بدم . که یک سری روش ها مثل راند رابین هست که میشه این کار رو کرد.

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

اما ما میبینیم که که ارسال عکس در بک گراند انجام میشه که بهش میگیم پردازش غیر همزمان !!

این جا بود که نخ (Thread) به کمک ما میاد ، یعنی شما میتونید چند کار رو به صورت موازی انجام بدین !

همین الان گفتم که نمیشه این کار رو کرد !!!

پس این چیه ؟؟؟!!

احتمالا مفهوم چند هسته ای رو شنیده اید، این یعنی چی ؟؟؟

این یعنی یک پردازنده خودش رو تبدیل میکنه به چند پردازنده گوچکتر و البته ضعیف تر !

یعنی میتونه روی رو چیز به صورت همزمان کار کنه

بعد یک کلاس سیستم عامل میریم سراغ اندروید !




خوب رسیدم به این ها : RxJava & RxAndroid

ما با این دو کتاب خونه میتونیم پردازش غیر همزمان رو برای اندروید پیاده سازی کنیم که در حالت عادی کمی سخت تر هست ، همین! که شرکت reactivex یک کتاب خانه ای معرفی کرد که برای اندروید Rxjava بهتر کار کند و یک سری قابلیت ها بهش داد برای اطلاعات بیشتر میتونید به گیت هاب اون ها سر بزنید.

کار کردن با اون بسیار آسون هست .

و ما کلا دو چیز خیلی مهم داریم Observable , Observer

یک نونوایی رو در نظر بگیرید ، یک سری آدم هستند که نون میخواهند و یک نانوا هست که نون رو میده دست مشتری ، فرض کنید رابطه Observable شبیه به نانوا هست و Observer شبیه به مشتریان که باید کارشان تک تک راه بیفتد

پیاده سازی یک پروژه کوچیک

قدم اول ، اضافه کردن Rxjava و RxAndroid

dependencies { implementation 'io.reactivex.rxjava3:rxandroid:3.0.0' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. // (see https://github.com/ReactiveX/RxJava/releases for latest 3.x.x version) implementation 'io.reactivex.rxjava3:rxjava:3.0.0'

یا

allprojects { repositories { maven { url &quothttps://oss.jfrog.org/libs-snapshot&quot } } }


قدم دوم ، اصل داستان

Observable.just(&quotone&quot,&quottow&quot,&quottree&quot,&quotfor&quot,&quotfive&quot,&quotsix&quot)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Overridde public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull String s) { } @Override public void (@NonNull Throwable e) { } @Override public void onComplete() { } });

کد بالا یعنی یه نونوایی دارم با شش مشتر !

برو عملیات پردازش رو توی یک نخ دیگه انجام بدم بعد برگرد به نخ اصلی و وقتی که کارت تموم شد اون نخ رو حذف کن !

وقتی که onSubscribe شد یعنی ما مشترک شدیم روی اون و یک متغیر Disposable رو برمیگردونه که باید اونو بعدا dispose کنیم . چچوری ؟

مثلا توی onDestroy

if (disposable != null) disposable.dispose();

این قطعه کد رو اضافه کنیم.

تابع onNext یعنی با هر مشتری چیکار کنم !

تابع هم اگر مشکلی پیش اومده باشه اون رو اطلاع میده

و onComplete که زمانی اجرا میشه که کارمون تموم شده باشه

rxjavaاندرویدسیستم عامل
سوال های احمقانه ایست مرا که جوابی بر آن نیست، پس بنواز ای ساز گیتی تا ز آن خرد آموزم
شاید از این پست‌ها خوشتان بیاید