שילוב של השלמות RxJava

1. סקירה כללית

במדריך זה נשחק עם RxJava הושלם סוג, המייצג תוצאת חישוב ללא ערך ממשי.

2. תלות RxJava

בואו נכלול את התלות RxJava 2 בפרויקט Maven שלנו:

 io.reactivex.rxjava2 rxjava 2.2.2 

בדרך כלל אנו יכולים למצוא את הגרסה האחרונה ב- Maven Central.

3. סוג שלם

הושלם דומה ל נצפה למעט היוצא מן הכלל שהראשון משדר אותות השלמה או שגיאה אך ללא פריטים. ה הושלם הכיתה מכילה מספר שיטות נוחות ליצירה או השגה ממקורות תגוביים שונים.

אנו יכולים להוליד מופע המושלם באופן מיידי באמצעות Completable.complete ().

לאחר מכן נוכל לצפות במצבו באמצעות DisposableCompletableObserver:

Complete .complete () .subscribe (new DisposableCompletableObserver () {@Override public void onComplete () {System.out.println ("הושלם!");} @Override public void onError (Throwable e) {e.printStackTrace (); }});

בנוסף, אנו יכולים לבנות א הושלם מופע מ ניתן לקרוא, לפעולה ולרוץ:

Completable.fromRunnable (() -> {});

כמו כן, אנו יכולים להשיג הושלם מקרים מסוגים אחרים המשתמשים באחד מהם Completable.from () או מתקשר ignoreElement () על מקורות אולי, יחידים, זרימים ונצפים:

Flowable flowable = Flowable .just ("הבקשה התקבלה", "המשתמש מחובר"); Completable flowableCompletable = השלם .fromPublisher (זורם); SingleCompletable = Single.just (1) .ignoreElement ();

4. שרשור השלמות

אנו יכולים להשתמש בשרשור של השלמות במקרי שימוש רבים בעולם האמיתי, כאשר אכפת לנו רק מהצלחת הפעולה:

  • פעולות הכל או כלום כמו ביצוע בקשת PUT לעדכון אובייקט מרוחק ואחריו עדכון מסד נתונים מקומי לאחר ההצלחה
  • רישום ורישום ביומן לאחר מעשה
  • תזמור של מספר פעולות, למשל. הפעלת עבודת ניתוח לאחר השלמת פעולת בליעה

אנו נשמור על דוגמאות פשוטות ובעיות אגנוסטיות. שקול שיש לנו כמה הושלם מקרים:

השלם ראשון = השלם .fromSingle (Single.just (1)); שנייה מלאה = השלם .fromRunnable (() -> {}); זורק לזריקה = RuntimeException חדש (); שגיאה שהושלמה = Single.error (לזרוק) .ignoreElement ();

לשלב שניים השלמות לכדי אחד, נוכל להשתמש ב- ואז() מַפעִיל:

ראשון .ואז ואז (שני) .טסט () .assertComplete ();

אנחנו יכולים לשרשר כמה שיותר השלמות לפי צורך. באותו הזמן, אם לפחות אחד מהמקורות לא יושלם, וכתוצאה מכך הושלם לא יורה onComplete () גם כן:

ראשון .andThen (שני) .andThen (שגיאה) .test () .assertError (לזריקה);

יתר על כן, אם אחד המקורות אינסופי או לא מגיע onComplete משום מה, התוצאה הושלם לעולם לא יורה onComplete () ולא onError () גם כן.

דבר טוב שאנחנו עדיין יכולים לבדוק את התרחיש הזה:

.... ואז (Completable.never ()) .test () .assertNotComplete ();

5. סדרת קומפוזיציות להשלמה

דמיין שיש לנו חבורה של השלמות. נכון למקרה השימוש המעשי, נניח שעלינו לרשום משתמש במספר מערכות משנה נפרדות.

להצטרף לכולם השלמות לכדי אחד, נוכל להשתמש ב- לְמַזֵג() משפחת שיטות. ה לְמַזֵג() המפעיל מאפשר מנוי לכל המקורות.

המקרה שנוצר מסתיים לאחר השלמת כל המקורות. בנוסף, זה מסתיים עם onError כאשר אחד מהמקורות פולט שגיאה:

Completable.mergeArray (ראשון, שני) .test () .assertComplete (); Completable.mergeArray (שגיאה ראשונה, שנייה) .test (). AssertError (זורק);

נעבור למקרה שימוש מעט אחר. נניח שעלינו לבצע פעולה עבור כל אלמנט המתקבל מ- a זורם.

ואז, אנחנו רוצים סינגל הושלם הן להשלמת המעלה והן לכל הפעולות ברמת האלמנט. ה flatMapCompletable() מפעיל בא לעזור במקרה זה:

השלם allElementsCompletable = זרימה .just ("בקשה התקבלה", "משתמש מחובר") .flatMapCompletable (הודעה -> השלמה. FromRunnable (() -> System.out.println (הודעה))); allElementsCompletable .test () .assertComplete ();

באופן דומה, השיטה הנ"ל זמינה עבור שאר שיעורי התגובה הבסיסיים כמו נצפה, אולי, או יחיד.

כהקשר מעשי ל flatMapCompletable ()יכולנו לחשוב על קישוט כל פריט עם תופעת לוואי כלשהי. אנו יכולים לכתוב ערך יומן לכל אלמנט שהושלם או ליצור תמונת אחסון בכל פעולה מוצלחת.

סוף כל סוף, ייתכן שנצטרך לבנות א הושלם מכמה מקורות אחרים והפסיקו אותו ברגע שאחד מהם יושלם. זה המקום אמב מפעילים יכולים לעזור.

ה אמב קידומת היא יד קצרה עבור "דו משמעי", המרמז על חוסר הוודאות לגביו הושלם בדיוק מסתיים. לדוגמה, ambArray ():

Completable.ambArray (ראשון, Completable.never (), שני) .test () .assertComplete ();

שים לב, שהאמור לעיל הושלם עשוי גם להסתיים עם onError () במקום onComplete () תלוי מקור המקור המושלם מסתיים תחילה:

Completable.ambArray (שגיאה, ראשון, שני) .test () .assertError (ניתן לזריקה);

כמו כן, לאחר סיום המקור הראשון, מובטח שייפטר מהמקורות הנותרים.

פירוש הדבר שכל שנותר פועל השלמות נעצרות באמצעות Disposable.dispose () והרשומות המתאימות של CompletableObser מנוסות.

לגבי דוגמה מעשית נוכל להשתמש בה amb () כאשר אנו מזרימים קובץ גיבוי למספר מקבלי אחסון מרוחקים. ואנחנו משלימים את התהליך לאחר סיום הגיבוי הראשון הטוב ביותר או חוזרים על התהליך לאחר שגיאה.

6. מסקנה

במאמר זה סקרנו בקצרה את הושלם סוג RxJava.

התחלנו עם אפשרויות שונות להשגה הושלם מקרים ואז משורשרים ומורכבים השלמות באמצעות andThen (), merge (), flatMapCompletable (), ו אמב ... () מפעילים.

אנו יכולים למצוא את המקור לכל דוגמאות הקוד ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found