PracticU

הרצת Pending Transactions

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › הרצת Pending Transactions
מילון מושגים:
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
Fragment - ב-Android, רכיב ממשק הניתן לשימוש חוזר בתוך Activity, שמייצג חלק ממסך או התנהגות.

הרצת Pending Transactions
כשמחליפים פרגמנט בזמן ריצה ומיד משתמשים באובייקט החדש, אפשר לקבל קריסה על null. ההרצאה מסבירה למה זה קורה ואיך executePendingTransactions פותרת את זה.
מה קורה
1. ההחלפה: בלחיצה על לחצן יוצרים אובייקט פרגמנט חדש וקוראים ל-getSupportFragmentManager().beginTransaction().replace(...) לתוך R.id.FragmentLayoutContainer. (בהדגמה זה אותו סוג פרגמנט, ובמציאות בדרך כלל תהיה מחלקה אחרת.)
2. הקריסה: מיד אחרי ההחלפה קוראים ל-displayAnimal, והאפליקציה נופלת על NullPointerException בקריאה ל-setImageResource על אובייקט null.
3. הסיבה: יצירת אובייקט לא מריצה את onCreateView. הפונקציה רצה רק כשהפרגמנט מתווסף לאקטיביטי ומתחיל מחזור החיים שלה, והטרנזקציה אסינכרונית, כך שהקוד המשיך לפני שה-view אותחל.
4. הפתרון: קוראים ל-getSupportFragmentManager().executePendingTransactions(). היא מורה למערכת לסיים עכשיו את כל הטרנזקציות הממתינות, וכך הופכת את הפעולה מאסינכרונית לסינכרונית.
5. מתי משתמשים: בעיקר כשרוצים להשתמש בפרגמנט מיד אחרי הוספתה, בדרך כלל בלחצנים ואירועים. פחות ב-onCreate, אם כי מותר גם שם מיד אחרי טרנזקציה.
פקודות והגדרות
replace, add ו-remove על ה-fragment manager, ו-executePendingTransactions().
אחרי הוספת הקריאה האפליקציה רצה והלחצן עובד. כעת אפשר להשתמש בפרגמנט מיד אחרי טרנזקציה, בלי לקבל null.
השיעור הבא בקורס: Child Fragment

פרקי ההרצאה: הרצת Pending Transactions

  1. 00:00

    החלפת Fragment עם replace

  2. 00:38

    יצירת Fragment חדש בלחיצה

  3. 01:34

    קריסת NullPointerException בהרצה

  4. 02:39

    למה onCreateView עוד לא התבצע

  5. 03:41

    סיום הטרנזקציה עם executePendingTransactions

  6. 04:36

    מתי להשתמש בפקודה ובדיקה חוזרת

תמלול ההרצאה: הרצת Pending Transactions

הטקסט המלא של הדקות הראשונות בהרצאה «הרצת Pending Transactions» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:01

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

  2. 00:17

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

  3. 00:35

    בואו רגע נבצע הדמיה כזאת כאן. בלחיצה על הלחצן, אם אנחנו נרצה לבצע החלפה של אובייקט הפרגמנט, אז אנחנו נצטרך לבצע משהו כזה. נקרא ל-AnimalFragment, שווה NewAnimalFragment, הנה יש לנו פה אובייקט פרגמנט חדש לגמרי, ונבצע getSupportFragmentManager בגיןTransactionReplace

  4. 01:02

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

  5. 01:20

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

  6. 01:46

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

  7. 02:05

    ניגש לקריסה, נלחץ על הלינק, ונראה שאנחנו נופלים על null pointer exception, attempt to invoke virtual method, והמתוד הנקראת set image resource, on a null object reference.

  8. 02:25

    זאת אומרת בדיוק אנחנו רואים גם שהוא מסמן לנו את השורה הזאת ואומר לנו איך אתם יכולים לקרוא לסט image resource ולשלוח איזשהו מידע אינטג'רי כאשר האובייקט הזה הוא נל. אבל למה שהאובייקט הזה יהיה נל? הרי זה בעצם אחד מהאובייקטים שקיימים בלהוט שלנו ואנחנו יודעים כמובן שonCreateView התבצעה והכל בסדר.

  9. 02:52

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

  10. 03:19

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

  11. 03:43

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

  12. 04:01

    Get Support Fragment Manager נקודה Execute Pending Transaction. הטרנזקשן שהתבצע כאן היא הייתה אסינכרונית והמערכת המשיכה והטרנזקציה לא באמת הסתיימה. execute pending transaction זאת פונקציה שאומרת למערכת בואי בשלב הזה תסיימי את כל הטרנזקציות הפתוחות שלך כי אנחנו רוצים בעצם להתחיל לעבוד עם הפרגמנט ממש ממש מיד ולכן אנחנו הופכים

  13. 04:29

    בעצם את הפעילות האסינכרונית לפעילות סינכרונית כאשר אנחנו ממתינים עד שכל הטרנזקציות יתבצעו ואז אנחנו יכולים להשתמש עם זה. בדרך כלל אנחנו נרצה להשתמש ב-Execute Pending Transaction, כאשר אנחנו רוצים מידית לפתוח פריגמנט ולהשתמש איתה, זה בדרך כלל יהיה בתוך לחצנים או בתוך כל מיני אירועים, זה פחות יהיה ב-On Create,

  14. 04:53

    למרות שאין מניעה גם מיד אחרי ביצוע טרנזקציה ב-On Create לבצע את Execute Pending Transaction. אז בואו רגע נריץ שוב פעם, הנה אנחנו רואים שאנחנו רצים, נלחץ על הלחצן, והכל בסדר, נפטרה בעיה בעזרת

לקורס המלא: קורס פיתוח אפליקציות לאנדרואיד

ההרצאה הקודמת: שמירת Fragment State

ההרצאה הבאה: Child Fragment

הרצאות קשורות מקורסים אחרים

  • הרצת הטסטים האוטומטיים - סיכום
  • הרצת קבצי JAR
  • הרצת Image מתוך DTR
  • הרצת גיבוי - Veeam

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון