
CursorLoader נרשם לשינויים בקורסור ומעדכן אוטומטית.LoaderManager.LoaderCallbacks<Cursor> וכך מתקבלות שלוש פונקציות: onCreateLoader, onLoadFinished ו-onLoadReset.getSupportLoaderManager().initLoader עם ID (כאן 1), null לארגומנטים, ואת האקטיביטי עצמו.new CursorLoader עם הקונטקסט וה-URI ושאר הפרמטרים null. המחלקה צריכה להיות מהחבילה android.support.v4.content, כמו ה-LoaderManager.productsCursor). אם הקורסור null, ה-URI לא מצביע על ספק אמיתי ומציגים הודעה. onLoadReset נשארת ריקה.moveToFirst ואחריה moveToPrevious, כדי לחזור למצב שלפני הרשומה הראשונה לפני הלולאה. אחרי התיקון כל לחיצה מציגה מידע עדכני.הטקסט המלא של הדקות הראשונות בהרצאה «Content Provider - חלק 3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שהצלחנו לצרוך content provider אנחנו הולכים לעשות איזשהו change באפליקציה הזאת שצורכת את ה-content provider כך שהיא תהיה יותר יעילה מבחינת performance. קודם כל מה הבעיה שקיימת כרגע?
הבעיה שקיימת כרגע היא כזאת אנחנו בנינו אפליקציה משלנו שניגשת לאפליקציה אחרת וצורכת ממנה מידע אבל יכול להיות שהאפליקציה האחרת היא כבדה ולוקח לה הרבה זמן להחזיר לנו את המידע.
אנחנו לא מכירים את האפליקציה האחרת, זאת לא אפליקציה שאנחנו בנינו, ולכן אין לנו שליטה על כמה זמן האפליקציה האחרת הולכת לעבוד, מה המהירות שלה, כמה מהר היא הולכת להביא לנו את המידע וכדומה.
אז מה שאנחנו רוצים לעשות זה לעשות את כל הסיפור הזה בצורה קצת יותר יעילה, או קצת הרבה יותר יעילה, ואנחנו עושים את זה בעזרת רכיב שנקרא לואודר.
לורדר זה רכיב שמאפשר לטעון מידע או לעשות פעולות אחרות אבל הוא ברקע עושה את העבודה הקשה ב-thread נפרד. יש קודם כל כמה חסרונות אם אנחנו לא משתמשים בלורדר.
חיסרון ראשון כפי שאמרנו זה שיכול להיות שכל הסיפור הזה יהיה יותר מדי איטי ולכן ברגע שהיוזר לוחץ על הלחצן אז האפליקציה שלו נתקעת כי אנחנו תלויים באפליקציה אחרת שלוקח לה זמן לתת לנו שירות יכול להיות שהמידע מאוד גדול וכל הסיפור הזה לוקח הרבה זמן להביא את המידע.
יכול להיות שהיוזר מבצע שתי לחיצות והוא רוצה בעצם את אותו המידע כעת סתם מתבצע שתי קריאות לאותו המידע בדיוק שזה קצת מיותר. אם אנחנו בונים thread משלנו אנחנו נהיה חייבים לטפל בכל הנושא של איך המידע שקיים בתוך ה-thread ניגש לממשק המשתמש.
כי יש איזושהי בעיה בנוגע ל-threadים עם עדכון user interface. הבעיה היא שאם אנחנו נמצאים בקוד של thread שאנחנו בונים, אז אנחנו לא יכולים מהקוד הזה לעדכן ולגעת בכל רכיבי ה-interface, בכל רכיבי ממשק המשתמש.
אנחנו צריכים לעשות כל מיני מניפולציות בשביל להצליח באמת לעדכן את המידע הזה. עכשיו, מה היתרונות בשימוש בלואודר?
אם אנחנו משתמשים בלואודר, ראשית כל הלואודר רץ ב-thread נפרד. שנית, הלואודר מספק לנו אירועים שרצים באותו ה-thread של ממשק המשתמש, כך שבאירועים האלה אנחנו כן יכולים לגעת בממשק המשתמש ולעדכן בו את המידע.
זאת אומרת שאנחנו לא צריכים יותר מדי לטפל בכל הקונספט הזה של איך הקוד שרץ בטרד נוגע בממשק הוא ממש פשוט במקרה הזה.
יתרון שלישי זה שהלואודר אוטומטית מבצע קאשינג למידע אם אנחנו נבקש את אותו המידע שוב ושוב אז הלואודר אוטומטית יביא לנו את המידע הזה מהקאש שלו איזשהו זיכרון פנימי שהוא מנהל ולא תתבצע סתם קריאות חוזרות ונשנות לקונטנט פרוביידר.
יתרון רביעי זה שהלואודר יכול אוטומטית לעדכן את הקורסור שלנו בכל מיני שינויים שהתרחשו. לדוגמה, אם הלואודר שלנו מתעסק עם קורסור, קורסור לואודר, אז הוא אוטומטית נרשם לשינויים שהתבצעו בקורסור ואוטומטית יכול להגיד לנו, היי, יש פה איזשהו שינוי, בואו תעדכנו את המידע.
אז בואו נראה איך אנחנו יכולים לקחת בדיוק את אותה אפליקציה האחרונה שעשינו ולצרוך את המידע הזה על ידי לואודר. הדבר שאנחנו צריכים לבצע זה לגשת לרמת האקטיביטי ולממש loader manager.loader callbacks ולתת לסוגריים של הרכיב ג'נרי כזה את
הסוג שאנחנו רוצים לטפל בו מבחינתנו זה קורסור כי יש כל מיני סוגי לואודרים ואנחנו רוצים את קורסור לואודר בואו נלחץ על אלט Enter Implement Methods ויש לנו סך הכל שלוש פונקציות שקיימות בתוך האינטרפייס הזה.
בואו נראה אותן. הפונקציה הראשונה זאת פונקציה שנקראת OnCreateLoader והיא מחזירה לנו לואודר של קורסור. אנחנו רואים שכרגע אין בה כלום והיא פשוט מחזירה לנו נאל.
הפונקציה השנייה נקראת OnLoadFinished והפונקציה השלישית נקראת OnLoadReset. בואו נבין קודם כל מתי כל אחת מתבצעת.
הפונקציה הראשונה מתבצעת כאשר אנחנו דורשים לואודר, רוצים להתחיל אותו בלואודר חדש. אז הוא נוצר, תכף נראה מה אנחנו עושים כאן בתוך הפונקציה.
הפונקציה השנייה מתבצעת ברגע שהלואודר מוכן לשימוש. כאן בפונקציה הזאת אנחנו נרצה להשתמש עם הקורסור שמוחזר לנו, והפונקציה השלישית מתבצעת כאשר הלואודר בעצם מהותחל מחדש.
אז מה אנחנו רוצים לעשות בשלושת הפונקציות? דבר ראשון בלחצן אנחנו לא רוצים לבצע את הקריאה הזאת כל ה-URI ואת חול המידע אלא כל מה שאנחנו רוצים לעשות בלחצן זה get support loader manager זה מביא לנו object loader ואנחנו רוצים to init לואודר ולשלוח קודם כל איזשהו איי-די ניתן לו כרגע אחד יש לנו כאן פרמטרים שאנחנו
יכולים לשלוח ללואודר אין לנו שימוש כרגע בהם בואו נעביר נאל ואת הקונטקסט שלנו או ליתר דיוק מי מממש את האינטרפייס וזה אנחנו נקסט הדבר הבא שאנחנו רוצים לעשות זה לגשת לאון קריאייט לואודר ובאון קריאייט לואודר אנחנו רוצים ליצור