PracticU

Content Provider - חלק 3

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › Content Provider - חלק 3
מילון מושגים:
תהליכון - יחידת ביצוע בתוך תהליך, המאפשרת להריץ כמה מהלכים במקביל ולחלוק את אותו זיכרון.
אירוע - התרחשות שהמערכת מזהה ויכולה להגיב לה, כמו לחיצת עכבר, הקשה או סיום פעולה.
מטמון - אחסון זמני ומהיר של נתונים שנדרשים שוב, כדי להאיץ גישה ולהפחית עומס מהמקור המקורי.
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
חבילה - אוסף ארוז של קוד, ספריות או קבצים המופץ כיחידה אחת ומותקן בעזרת מנהל חבילות.
Android - מערכת הפעלה מבוססת Linux לטלפונים ולמכשירים ניידים, שפותחה על ידי גוגל.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.

Content Provider - חלק 3
כשאפליקציה צורכת Content Provider של אפליקציה אחרת, היא לא שולטת במהירות ההחזרה. הפתרון בשיעור הוא Loader, רכיב שטוען נתונים ברקע ב-thread נפרד.
למה Loader
- בלי Loader הממשק עלול להיתקע כשהאפליקציה האחרת איטית או שהמידע גדול.
- שתי לחיצות עלולות לגרום לשתי קריאות לאותו מידע.
- בבניית thread ידנית צריך לטפל בעדכון ממשק המשתמש.
- ה-Loader רץ ב-thread נפרד, אבל האירועים שלו רצים ב-thread של הממשק ולכן אפשר לעדכן בהם רכיבים.
- ה-Loader שומר cache של המידע.
- CursorLoader נרשם לשינויים בקורסור ומעדכן אוטומטית.
השלבים העיקריים
1. מימוש הממשק: האקטיביטי מממש LoaderManager.LoaderCallbacks<Cursor> וכך מתקבלות שלוש פונקציות: onCreateLoader, onLoadFinished ו-onLoadReset.
2. הפעלה מהלחצן: במקום פנייה ל-content resolver קוראים ל-getSupportLoaderManager().initLoader עם ID (כאן 1), null לארגומנטים, ואת האקטיביטי עצמו.
3. onCreateLoader: בונים את ה-URI של ה-Content Provider ומחזירים new CursorLoader עם הקונטקסט וה-URI ושאר הפרמטרים null. המחלקה צריכה להיות מהחבילה android.support.v4.content, כמו ה-LoaderManager.
4. onLoadFinished: מעבירים לפונקציה את קוד קריאת הקורסור (נקרא productsCursor). אם הקורסור null, ה-URI לא מצביע על ספק אמיתי ומציגים הודעה. onLoadReset נשארת ריקה.
טעות נפוצה
בלחיצה שנייה לא מתקבל מידע כי הקורסור כבר הגיע לסופו. פותרים זאת עם moveToFirst ואחריה moveToPrevious, כדי לחזור למצב שלפני הרשומה הראשונה לפני הלולאה. אחרי התיקון כל לחיצה מציגה מידע עדכני.
כעת אפשר לטעון מידע מ-Content Provider בלי לתקוע את הממשק, ובמיוחד כשמדובר במידע גדול.
השיעור הבא בקורס: Content Provider - חלק 4

פרקי ההרצאה: Content Provider - חלק 3

  1. 00:00

    בעיית ביצועים בצריכת Content Provider

  2. 00:55

    רכיב Loader לטעינה ברקע

  3. 01:51

    עדכון ממשק המשתמש מתוך תרד

  4. 02:31

    יתרונות השימוש ב-Loader

  5. 03:07

    Caching ועדכון אוטומטי של הקורסור

  6. 03:43

    מימוש LoaderCallbacks באקטיביטי

  7. 04:29

    onCreateLoader, onLoadFinished ו-onLoaderReset

  8. 05:24

    הפעלת ה-Loader עם initLoader

תמלול ההרצאה: Content Provider - חלק 3

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

  1. 00:01

    אחרי שהצלחנו לצרוך content provider אנחנו הולכים לעשות איזשהו change באפליקציה הזאת שצורכת את ה-content provider כך שהיא תהיה יותר יעילה מבחינת performance. קודם כל מה הבעיה שקיימת כרגע?

  2. 00:17

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

  3. 00:34

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

  4. 00:49

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

  5. 01:01

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

  6. 01:17

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

  7. 01:40

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

  8. 02:05

    כי יש איזושהי בעיה בנוגע ל-threadים עם עדכון user interface. הבעיה היא שאם אנחנו נמצאים בקוד של thread שאנחנו בונים, אז אנחנו לא יכולים מהקוד הזה לעדכן ולגעת בכל רכיבי ה-interface, בכל רכיבי ממשק המשתמש.

  9. 02:24

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

  10. 02:35

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

  11. 02:53

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

  12. 03:03

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

  13. 03:22

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

  14. 03:47

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

  15. 04:13

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

  16. 04:31

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

  17. 04:47

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

  18. 04:58

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

  19. 05:09

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

  20. 05:25

    אז מה אנחנו רוצים לעשות בשלושת הפונקציות? דבר ראשון בלחצן אנחנו לא רוצים לבצע את הקריאה הזאת כל ה-URI ואת חול המידע אלא כל מה שאנחנו רוצים לעשות בלחצן זה get support loader manager זה מביא לנו object loader ואנחנו רוצים to init לואודר ולשלוח קודם כל איזשהו איי-די ניתן לו כרגע אחד יש לנו כאן פרמטרים שאנחנו

  21. 05:52

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

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

ההרצאה הקודמת: Content Provider - חלק 2

ההרצאה הבאה: Content Provider - חלק 4

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

  • הסבר על Provider ב-Flutter
  • הגדרת AWS provider - פרויקט NodeJS

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

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