
putExtra מקבלת טיפוסים פשוטים כמו int ו-String, אבל לפעמים רוצים לשלוח אובייקט מהמחלקה שלנו, למשל פריט שנבחר מרשימה. בשיעור שולחים אובייקט Book למסך שני בעזרת הממשק Serializable.Book עם שלושה שדות פרטיים: שם (name), סופר (author) ומחיר (price), גטרים וסטרים וקונסטרקטור שעובר דרך הסטרים, ו-toString שמחזיר "שם by סופר" ואת המחיר עם סימן דולר.Book (Android is fun, מוישה, 95.7) וקוראים ל-intent.putExtra("book", book). הקוד לא מתקמפל, כי לפונקציה אין גרסה שמקבלת את המחלקה, והמערכת לא יודעת איך להעביר את תוכנה.Serializable. זה ממשק בלי פונקציות, ורק מסמן למערכת שמותר להפוך את האובייקט למידע שאפשר לשלוח.getIntent().getSerializableExtra("book") ועושים cast ל-Book.textViewBook) מתחת לכותרת עם below ו-wrap_content, ומציבים בו book.toString(). בהרצה מופיעים הכותרת, הצבע והפרטים של הספר.match_parent. התיקון: below ו-wrap_content.Serializable.הטקסט המלא של הדקות הראשונות בהרצאה «Serializable» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כאשר אנחנו שולחים מידע מה-Parent Activity ל-Child Activity יכול להיות שאנחנו בעצם לא רוצים לבצע שליחה רק של אלמנטים פרימיטיביים כמו Int או String אלא אנחנו רוצים לבצע שליחה של אובייקט ממחלקה משלנו.
לדוגמה אם יש לנו איזושהי אקטיביטי שמציגה לנו ליסט של פריטים וכל פריט בליסט זה אובייקט ממחלקה משלנו וברגע שלוחצים על פריט בליסט אנחנו רוצים לפתוח second activity ולשלוח את המומש אובייקט עצמו ל-second activity בכדי שהיא תציג את כל שאר הפריטים שבו.
אז אם אנחנו רוצים לעשות את זה יש עוד משהו חשוב שאנחנו צריכים להבין ולשלב בכדי להצליח לבצע את זה. אז לצורך הדוגמה בואו פשוט נצרף כאן עוד איזושהי מחלקה, בואו נקרא לה Book והיא מתארת ספר, יש לספר לספר יש private string name יש לנו private string author סופר ויש לנו
price בואו נלחץ על Alt insert ונצרף גטרים וסטרים את שלושתם בואו נצרף על ידי Alt insert גם קונסטרקטור שיאכל את שלושתם אך במקום להכניס ישירות את המידע בואו נעבור דרך הסטרים set name וקצת יותר הגיוני set author ולבסוף set price והנה יש לנו עכשיו גם קונסטרקטור ובואו ניגש
פה למטה ונבצע alt insert ונוסיף לעצמנו איזושהי to string נחמדה כזאת שתאפשר פשוט להציג את כל המידע בצורה הבאה בואו נחזיר את הנים משורשר עם המילה ביי כלומר שם הספר ביי הסופר ובואו נשרשר רק את המחיר בכדי לראות את כל המשתנים כולם.
נשרשר פה איזה סימן של דולר בצורה כזאת והנה ארגנו לעצמנו איזושהי מחלקה מאוד פשוטה שמתארת ספר שיש לו שם סופר ומחיר ואנחנו רוצים עכשיו לשלוח מה-Parent Activity שזה ה-Main ל-Second Activity Object Book אז בואו ניגש לפה ונבנה לנו Book שווה New Book ואנחנו רואים שיש לנו פה
קונסטרקטור בואו ניגש וניתן לו את השם Android is Fun בואו נגיד שהסופר זה מוישה ובואו נגיד שהמחיר זה 95.7 והנה יש לנו עכשיו אובייקט בוק.
אז איך העברנו מקודם את שני הנתונים הקודמים? אז פשוט קראנו לפונקציה putExtra ואמרנו הנה איזשהו מפתח שמזהה את הפריט שאנחנו רוצים לשלוח והנה הפריט עצמו, במקרה הזה זה צבע, במקרה הזה זה איזושהי מחרוזת ובואו פשוט ננסה לעשות את אותו הדבר למחלקה בוק.
intent.putExtra בואו נקרא לו בוק פשוט ובואו נעביר את אובייקט הבוק נתבונן ונראה שהמערכת לא מסכימה והנה בדיוק כאן אנחנו צריכים לראות איך אנחנו מטפלים בסיטואציה הזאת למה המערכת לא מסכימה מפני שהפונקציה putExtra יש לה מספר מסוים של העמסות בואו נלחץ על control p בכדי לראות את כל הפרמטרים וכמובן שבכל ההעמסות האלה אין את המחלקה בוק
וגם אין אובייקט כי כל המחלקות יורשות מאובייקט כפי שאנחנו כבר מכירים באובייקט אוריינטד ואם בוט אקסטרה הייתה מקבלת אובייקט זה אומר שהיינו יכולים לשלוח כל דבר אבל בוט אקסטרה לא מקבלת אובייקט כפרמטר שני מפני שהמערכת צריכה לדעת איך בדיוק לשלוח את המידע של הבוק וכמובן איך להעביר את כל האינפורמציה שיש בתוכו ל-activity היעד.
אז כל מה שאנחנו צריכים לעשות בכדי לגרום לזה להצליח זה לגשת למחלקה Book ולרשת אינטרפייס מיוחד יותר נכון Implement אינטרפייס מיוחד שהאינטרפייס הזה נקרא Declarative Interface מה זאת אומרת זה אומר שזה אינטרפייס שאין בו בכלל פונקציות זה אינטרפייס מאוד מעניין והאינטרפייס הספציפי הזה נקרא serializable.
אם אנחנו ניכנס רגע עם קונטרול וקליק לאינטרפייס הזה אנחנו נראה שהוא ריק וזה קטע מאוד מעניין איך זה יכול להיות שיש בג'אווה אינטרפייס שהוא ריק לגמרי בלי פונקציות אנחנו לא צריכים לגשת ולממש שום פונקציה אולי אנחנו יכולים לראות את זה כאן מה הקלאסס טוב אנחנו לא רואים
פה שזה declarative interface אבל הרעיון הוא כזה, הרעיון הוא רק לציין שמשהו הוא סריאליזאבל עבור המערכת ואז ברגע שציינו את זה עבור המערכת אז אפשר בעצם להגיד למערכת שאנחנו כן מסכימים וכן יכולים לעשות משהו שנקרא סריאליזאבל על אובייקט בוק. מה זה אומר סריאליזאבל?
זה אומר עכשיו שג'אווה תיקח את האובייקט הזה ועל ידי פעולת ריפלקשן שזה בעצם הסתכלות בתוך הזיכרון בתוך כל הדאטה ממברס של האובייקט על ידי פעולת ריפלקשן היא תקרא את כל הערכים הפנימיים שיש בו תשלוף אותם וכך תוכל להעביר אותם לאקטיביטי היעד לאקטיביטי שאנחנו קוראים לה.
פעולת הרפלקשן הזאת מאפשרת לג'אווה לראות בדיוק מה יש בתוך המחלקה הזאת לשלוף את המידע ולשלוח אותו. פעולת הרפלקשן היא כבדה יחסית בזיכרון ולכן הפעולה הזאת היא לא הכי יעילה.
איך לעשות את זה בצורה יותר יעילה נראה בהמשך.