
registerGpsLocationUpdates, ומשכפלים אותה ל-registerNetworkLocationUpdates עם NETWORK_PROVIDER. הפונקציות של הקריטריון נמחקות, והקריאות בלחצן ובתשובת ההרשאה פונות לרישום GPS.Timer גלובלי. ב-registerGpsLocationUpdates, אם הטיימר קיים מבטלים אותו (cancel), יוצרים חדש, ו-schedule עם TimerTask אנונימי ל-10 שניות. ב-run קוראים ל-registerNetworkLocationUpdates. ב-Network משנים את הזמן המינימלי מ-5 ל-10 שניות, כי הוא פחות מדויק.onLocationChanged, אחרי הבדיקה שה-Location אינו null, בודקים אם location.getProvider() שווה ל-GPS_PROVIDER. אם כן, קוראים ל-unregisterLocationUpdates (שמבטל גם את הטיימר) ואז שוב ל-registerGpsLocationUpdates.הטקסט המלא של הדקות הראשונות בהרצאה «Provider Fallback» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטון הקודם, השגנו פרוביידר על ידי קריטריון. ומה שעשינו, זה בנינו פונקציה שמחזירה לנו את הפרוביידר, לדוגמה, הטוב ביותר לפי דיוק, או את הפרוביידר הטוב ביותר לפי חיסכון בסוללה, והמערכת מצאה לנו את הפרוביידר הזמין והטוב ביותר בהתאם לקריטריון שנתנו.
אבל למרות שזה בעצם שיטה הרבה יותר טובה מלהגיד סתם אני רוצה פרוויידר מסוים, עדיין המערכת יכולה להביא לנו פרוויידר בוא נניח GPS, כי יש רמה דיוק גבוהה, אבל אנחנו ספציפית נמצאים במקום ללא קליטת GPS ואז האפליקציה שלנו לא באמת תקבל את המיקום.
זאת אומרת, שחיפוש הפרוביידר לפי קריטריון רק בודק במכשיר איזה פרוביידר כרגע זמין לנו בנוגע לקריטריון או בהתאם לקריטריון שביקשנו, אבל לא באמת אם הפרוביידר הזה יעבוד בשטח ויביא לנו מיקום כמו שצריך.
אז בסרטון הזה אנחנו הולכים לראות שיטה אחרת שאולי היא יותר טובה מהקריטריון חיפוש, אולי אפשר גם לשלב אותה ביחד עם קריטריון החיפוש. והשיטה הזאת, זאת שיטה שמציינת Fallbacks.
כלומר, Fallbacks זה בעצם איזושהי אפשרות נוספת של פרוויידר נוסף במקרה, והפרוויידר הראשון נכשל. אז בוא נניח שאנחנו רוצים קודם כל ללכת על דיוק, במידה, ואנחנו יכולים לעבוד עם ה-GPS, אנחנו רוצים את ה-GPS, במידה ואין לנו קליטה עם הGPS, הפולבק שלנו הולך להיות הנטוורקס.
כמובן שאנחנו יכולים להמשיך ועל זה להגיד טוב, אם גם נטוורק לא הולך, בואו ננסה את הפאסיב. ואנחנו כמובן יכולים לשחק עם זה בכל מיני דרכים, אבל הדוגמה הזאת נעשה אותה הכי סימפל שיכול להיות לגבי הפולבק.
אם אני מצליח להשיג את הGPS, הכל בסדר, אם לא אני רוצה את הנטוורק, לנסות את הנטוורק. אז לצורך כך, יש לנו פה את הדוגמה הקודמת, ואני פשוט אפטר כרגע מהפונקציות של הקריטריה, כי אנחנו לא הולכים לעבוד איתן בדוגמה הזאת.
בואו נחזור בחזרה ל-Register Location Update, ונחזיר את ה-GPS. יש לנו פה GPS Provider, אין לנו כרגע את הפונקציות של הקריטריה, נמחק אותם, ויש לנו עכשיו פונקציה, אבל הפונקציה הזאת מבצעת Registration לפי GPS, ולכן נקרא לה Register GPS Location Updates.
בואו נעתיק אותה, נדביק אותה בכל מקום שהשתמשנו בה בעבר. וזה בעצם רק שני המקומות האלה. בלחיצה על הלחצן, אם אין לנו בעיית Permissions, אנחנו קוראים לה, וכאשר אנחנו חוזרים מהדיאלוג של הפרמישנס, אז כמובן אם היוזר אישר אותנו, גם אז אני רוצה לקרוא לה.
זאת אומרת שיש לנו פה פונקציה שמגדירה את הרישום ללוקיישן לפי GPS, ואנחנו קראנו לה Register GPS Location Updates. עכשיו בואו ניקח את הפונקציה הזאת, נשכפל את כולה ונבנה פונקציה נוספת שנקראת Register Network Location Updates.
אנחנו כמובן רוצים להשתמש עם ה-Network Provider. כרגע בינתיים אף אחד לא קורה לפונקציה הזאת. אז איך אנחנו עובדים עם Fallbacks? אז קודם כל כמו שאנחנו רואים אנחנו אומרים שהניסיון הראשון שלנו לבקש מיקום לפי פרוויידר זה לפי ה-GPS, אנחנו הולכים כרגע על דיוק גבוה.
מה אנחנו רוצים לעשות בפונקציה של ה-GPS? מה שאנחנו רוצים לעשות בפונקציה של ה-GPS, זה להפעיל טיימר. זאת בעצם שיטה אחת לביצוע fallback. הטיימר, בואו נניח, יופעל כעבור 10 שניות, וכעבור 10 שניות הוא אוטומטי תקרא לפונקציה של ה-Network Location Updates.
אם כן הצלחנו במהלך ה-10 שניות האלה להשיג מיקום לפי ה-GPS, אנחנו פשוט מבטלים את הטיימר, ואז הטיימר לא יקרה לפונקציה הזאת. כל פעם שאנחנו קוראים לפונקציה Register GPS Location Updates, אנחנו גם אפילים טיימר שאחרי 10 שניות מנסה להפעיל את הפונקציה הזאת.
אם הוא הצליח, זאת אומרת, שלא הצלחנו לקבל את המיקום לפי ה-GPS, ואז אנחנו מנסים לקבל אותו לפי הנטוורק. אם כן הצלחנו לקבל את המיקום לפי ה-GPS, אנחנו מבטלים את הטיימר.
אז זאת בעצם גישה מאוד פשוטה ומאוד פרקטית, לבצע fallback. אנחנו רוצים לגשת לאזור הגלובלי, וליצור private timer. אז בואו ניקח אובייקט טיימר, לא נכניס כאן אובייקט אמיתי כרגע, אלא אנחנו רוצים ממש כאן בפונקציה של ה-GPS לבנות טיימר חדש.
אז הנה יש לנו טיימר שווה new טיימר, אם תהי גדולה כמובן, והנה בנינו טיימר חדש לגמרי, ואנחנו רוצים להירשם לאירוע הסקדג'ול שלו, ולתת new timer ask יש לנו פה פונקציה אנונימית כזאת, מחלקה אנונימית ואנחנו יודעים שהפונקציה הזאת תתבצע כל פרק זמן שנגיד אנחנו אומרים את הפרק זמן ממש פה
אז בואו ניתן לו 10 שניות יש לנו 10 seconds והטיימר תוך 10 שניות מפעיל את הפונקציית run מה שאנחנו רוצים לעשות בפונקציית run זה להעתיק ולהדביק את הרג'יסטר נטוורק לוקיישן.
אם אנחנו לא מבצעים שום דבר, אז אנחנו מפעילים את הפונקציה הזאת. אם אנחנו בעצם לא מקבלים שום לוקיישן לפי GPS, אנחנו מנסים את הנטוורק. כמובן שלפני שאנחנו עושים את זה, בואו רק נבדוק האם הטיימר לא נעל.
זאת אומרת שיש כבר טיימר ישן, אז אנחנו רוצים to cancel it, ומיד להתחיל וליצור טיימר חדש. אחרי עשר שניות אנחנו רוצים לקרוא לפונציה Register Network Location Updates.
איפה אנחנו בעצם מבטלים את הטיימר? מעבר לביטול הזה, אנחנו רוצים לבטל אותו במידה, והצלחנו לקבל GPS ספציפית. אז איך אנחנו עושים את זה? אז קודם כל, בואו ניגש לפונקציה של ה-unregister, הנה היא נמצאת כאן.
בפונקציה של ה-unregister, אנחנו גם רוצים לגשת ולבטל את הטיימר, זאת אומרת, אם באים ואומרים, טוב, אנחנו כבר לא רוצים יותר לקבל מיקום, על ידי זה שהייתה, בוא נניח לחיצה ללחצן הזה, unregister location update, אין לנו צורך יותר בטיימר וביטלנו אותו.
אפילו אפשר לגשת לכאן ובמקרה הזה להכניס לתוכרונל כי אין לנו צורך יותר להשתמש בטיימר. אז זה בעצם משהו שאנחנו עושים ב-unregister. עכשיו בואו ניגש לפונקציה onLocationChanged.
זאת הפונקציה הכי חשובה שאוטומטית מתבצעת כאשר הטלפון קיבל מיקום. אם הוא קיבל מיקום אנחנו קודם כל בודקים בעצם אם המיקום הוא לא נעל.