اپراتور create
این اپراتور یک observable برای ما میسازد.
- نکته ای که داره اینه که این اپراتور مقداری که بهش میدیم (در مثال زیر words) رو وقتی یک observer آن را سابسکرایب میکند، بررسی میکند. (یعنی تا قبل از اینکه کسی سابسکرایب کنه، متد onNext در امیتر نمیدونه چیو میخواد به آبزرور منتشر کنه)
- در این اپراتور اگر یک observer سابسکرایب شود، متد subscribe در ObservableOnSubscribe فراخوانی میگردد.
- اگر دیتا رو دونه دونه به onNext بدهیم، دونه دونه هم منتشر میشه ولی اگر یک آرایه یا لیست به onNext بدهیم، کل اون رو منتشر میکنه. (یعنی متد onNext در observer فقط یک بار فراخونی میشه)
نکته: چه عناصر رو دونه دونه به onNext اضافه کنیم، چه آرایه رو کلی پاس بدیم متد subscribe در observable فقط یک بار فراخونی میشه. ولی در observable متد onNext به تعداد دیتا (اگر دونه دونه پاس داده شده باشن) فراخونی میشه. یعنی دیتا به صورت sequenial منتشر خواهد شد.
توضیح متدهای observer:
به محض سابسکرایب کردن متد onSubscribe فراخونی میشه. دیتاها در متد onNext خونده میشن و اگر خطایی باشه متد onError فراخونی میشه. اگر متد onComplete در observer فراخونی شده باشه، در observer نیز متد onComplete فراخونی میشه.
String[] words = {"Hi", "Hello", "salam"};
Observable<String[]> observable = Observable.create(new ObservableOnSubscribe<String[]>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String[]> emitter) throws Throwable {
emitter.onNext(words);
Log.d(TAG, ""+words);
emitter.onComplete();
}
});
observable.subscribe(new Observer<String[]>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String[] s) {
Log.d(TAG, ""+s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
});