terminology در Rxjava - قسمت دوم
در برنامه نویسی واکنشی (reactive programming) به جای داده (data) جریانی از داده (data flows) را داریم. به جریان داده stream هم گفته می شود.
به استریم قبل از اعمال اپراتور upStream و به استریم بعد از اعمال اپراتور downStream گفته می شود. شکل زیر:
تردینگ در RxJava:
Multi-Threading در RxJava بسیار ساده انجام میشه. بدون RxJava انجام یک پروسه در ترد بک گراند و ارسال نتیجه به ترد UI نیاز به کد زیادی داره، در حالی که با RxJava میشه توی دو خط این کارو انجام داد.
subscribeOn
میگه که observable سورس، دیتای خودشو توی کدوم ترد منتشر کنه. اگر چند تا از این بنویسیم فقط اولیش تاثیر داره. جای این اپراتور در chain فرقی نداره، چون قبل از اجرای اپراتورها (یعنی پس از ارزیابی subscriber) این اپراتور بررسی میشه.
نکته: تمامی اپراتورهای RxJava از نوع immutable هستند.
observeOn
cosumer دیتا رو توی تردی که توسط این اپراتور معرفی میشه، استفاده میکنه.
نکته: subscribeOn در upStream و observeOn در downStream اعمال می شود.
اگر بخواهیم هر عملیات را به صورت جداگانه در یک ترد انجام دهیم، چگونه می توان ترد را عوض کرد؟
برای تغییر ترد باید قبل از اپراتور مورد نظر از observeOn استفاده کنیم و ترد مد نظرمون رو معرفی کنیم. در این صورت آن اپراتور در این ترد تسک خود را انجام می دهد.
بنابراین تغییر ترد توسط "observeOn" انجام خواهد شد.
مثال:
getIntegersFromRemoteSource()
.doOnNext(integer->println("Emitting item "+integer+" on: "+currentThread().getName()))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.map(integer->{
println("Mapping item "+integer+" on: "+currentThread().getName());
return integer*integer;
})
.observeOn(Schedulers.newThread())
.filter(integer->{
println("Filtering item "+integer+" on: "+currentThread().getName());
return integer%2==0;
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(integer->println("Consuming item "+integer+" on: "+currentThread().getName()));
نتیجه اخلاقی:
subscribeOn از اول تا جایی که هست ترد upStream را تغییر می دهد و observeOn از خودش تا observeOn بعدی ترد downStream را تغییر می دهد.
مقالات خوب برای تردینگ: