
AsyncTask שכבר רץ, ולקבל את מה שחושב עד לאותו רגע.ProgressBar. כדי לקרוא ממנו לביטול, מעבירים את אובייקט ה-PrimesFinder לשדה גלובלי.primesFinder.cancel(true).cancel רק מדווחת שמישהו ביקש להפסיק ולא עוצרת את הפעילות בעצמה. לכן בתוך doInBackground בודקים isCancelled(), ואם ביקשו ביטול יוצאים מהלולאה ומחזירים את המספרים שנמצאו עד עכשיו.onCanceled(String primes). דורסים ב-AsyncTask את onCancelled עם התוצאה, וקוראים מתוכה ל-listener.onCanceled ומציגים את התוצאה החלקית. את האחוז לא מגדירים ל-100, כי העבודה לא הושלמה.AsyncTask מריץ עבודה בתרד נפרד ומאפשר לעדכן את ה-UI בכמה שלבים: לפני ההתחלה, תוך כדי עם אחוז, בסוף עם תוצאה וגם בביטול. זה בסיס לעבודה הבאה עם האינטרנט, שבה מביאים מידע ומעדכנים את המסך.הטקסט המלא של הדקות הראשונות בהרצאה «ביטול משימה אסינכרונית» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
מה שנשארנו לראות בנוגע לאסינג טאסק זה איך המשתמש יכול לבצע קאנסל עבור האסינג טאסק. בואו ניקח לחצן ונאפשר למשתמש ללחוץ עליו בכדי לבצע קאנסל של כל הסיפור הזה. נגדיר את הלחצן הזה כאן מתחת לפרוגרס בר מעל כל הסיפור הזה ונקרא לו, נגדיר שהוא פשוט יחיל קאנסל או סטופ.
בוא נגיד ככה, נגיד אותו כButtonStop, שהוא יעצור את כל התהליך, בואו ניגש לקוד שלו, וכל מה שאנחנו צריכים לבצע בקוד זה לקרוא לפונקציית Cancellation כלשהי, והפונקציה הזאת נמצאת בתוך אובייקט הפריימס, פיינדר, ולכן אנחנו נאלצים להעלות אותו לאזור הגלובלי.
בואו נגדיר פה Private, Primes Finder, נפטר מזה שהוא לא יהיה לוקלי, שיהיה גלובלי, וניגש לפונקציית Stop, Rhymes Finder, ויש לנו פה פונקציית Cancel. אנחנו צריכים להגדיר True, בכדי לגרום לפונקציה לעבוד, אפילו שהוא נמצא בתהליך, באמצע התהליך.
בואו רגע נעלה את זה לכאן, שיהיה ביחד עם כל הלחצנים. ועכשיו הדבר הזה לא באמת מפסיק את התהליך. מה זאת אומרת? כל מה שעשינו זה אמרנו שאנחנו מעוניינים לבצע cancellation.
מה שאנחנו צריכים לעשות זה לבדוק בתהליך הפעילות שמתרחשת מאחורי הקלעים, האם מבחוץ ביקשו cancellation, ואם כן לבצע הפסקה יזומה של הפעילות. עוד פעם, ברגע שקראנו לפונציית cancel זה לא מפסיק את הפעילות, זה רק מדווח שמישהו ביקש להפסיק.
ואז אנחנו צריכים לבדוק כאן isCanceled, האם מישהו ביקש להפסיק, אז אנחנו רוצים לצאת מהלולאה וזה מה שיגרום להפסקה, כי אנחנו כן צריכים להחזיר משהו. אז בואו נחזיר את המספרים שמצאנו עד עכשיו.
עכשיו כדאי לנו מאוד לדווח שבעצם הפעילות הפסיקה כתוצאה מקאנסל, ואת זה נעשה על ידי פונקציה נוספת בתוך האינטרפייס, נקרא לה onCanceled, ונדווח גם בפונקציה הזאת את הפריים, דיר פה string primes, ואנחנו רוצים לדרוס פונקציה שנקראת onCanceled, שמקבלת את הריזולט, ומה שאנחנו רוצים לעשות בפונקציה זה לדווח שבעצם הפעילות הופסקה,
בואו ניקח כאן את ה-Result, ונשלח את ה-Result, ואז אנחנו צריכים לממש את הפונקציה האחרונה, onCanceled, אופה, לחצתי בטעות, על Cancel, כלומר Cancel ולוחץ על Cancel.
והנה כאן אנחנו יכולים להתחיל לבצע פה פעולות סיום. מה אנחנו רוצים לעשות? אז את האחוז, אין לנו מה להגדיר שזה 100%, כי לא סיימנו את המאה אחוז, אבל בואו כן נציג את זה, נציג את התוצאה שהגענו אליה עד עכשיו.
בואו נבדוק, בואו נכניס שוב פעם מספרים גדולים, מיליון, נכניס שתי מיליון, נפטר מהמקלדת, נתחיל להריץ, ובאזור 80% נלחץ על סטופ ואנחנו רואים שהמערכת הפסיקה באמצע, דיווחה לנו את מה שהיא דיווחה לנו, יש לנו פה את כל המספרים הראשונים שנמצאו עד שלחצנו על סטופ, והכל עובד כמו שצריך עם האפשרות של
היוזר לבצע הפסקה באמצע של התהליך. אז ראינו כאן איך אנחנו משתמשים באסינג טאסק בכדי לבצע פעילות מאחורי הקלעים וכך ה-UI משוחרר, הפעילות מתבצעת בטרד נפרד מהתרד של ה-UI.
ואנחנו גם יכולים להדכן את ה-UI בכל מיני שלבים באמצע, בין אם זה בסוף עם תוצאה סופית, בין אם זה בהתחלה לפני שאנחנו מתחילים, תוך כדי התהליך, כמה אחוז יסתיים וגם אם אנחנו