PracticU

הסבר על Async Task

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

הסבר על Async Task
AsyncTask מריץ קוד בתרד נפרד ומאפשר גם לעדכן את ה-UI במקומות הנכונים, ולכן הוא פותר את שתי הבעיות שנוצרו עם thread רגיל. ההרצאה הופכת את PrimesFinder ל-AsyncTask.
השלבים העיקריים
1. ירושה במקום Runnable: PrimesFinder יורש מ-AsyncTask, מחלקה Generic עם שלושה טיפוסים. הראשון הוא מה שהיא מקבלת, כאן Long (תחילת הטווח וסופו). השני הוא מה שהיא מדווחת תוך כדי עבודה, כאן Void כי עדיין לא מדווחים. השלישי הוא התוצאה הסופית, כאן String עם כל הראשוניים.
2. doInBackground: פונקציה חובה, שרצה בתרד נפרד ולכן אסור לה לגעת ב-UI. מקבלת פרמטרים בצורת Long..., כלומר מערך: params[0] הוא start ו-params[1] הוא end. כאן נמצא האלגוריתם הארוך, והיא מחזירה את stringBuilder.toString().
3. onPostExecute: רצה אוטומטית בתרד ה-UI בסיום, ומקבלת את הערך ש-doInBackground החזירה. לכן מותר בה לגעת ב-UI, והיא קוראת ל-listener.onSuccess(result). מקובל לקרוא לה כך, ובמקרה של בעיה מדווחים onError.
4. onPreExecute: רצה לפני doInBackground, גם בתרד ה-UI. קוראת ל-listener.onAboutToStart() כדי להודיע ל-Activity שהעבודה עומדת להתחיל.
5. ממשק: Callbacks מכיל עכשיו onAboutToStart ו-onSuccess במקום onFinish. ה-constructor מקבל רק את ה-callbacks.
6. הפעלה: ב-Activity יוצרים PrimesFinder עם this וקוראים ל-execute(start, end). אין צורך ב-Thread או ב-start.
סדר הקריאה
onPreExecute (UI), אחר כך doInBackground (תרד נפרד, ה-UI משוחרר), ובסוף onPostExecute (UI) עם התוצאה.
בדיקה
בטווח של מיליון עד שלושה מיליון ה-UI נשאר זמין, והתוצאה מוצגת בסיום בלי קריסה. בטווח קטן התוצאה מהירה.
כך מריצים עבודה ארוכה ברקע ומעדכנים את המסך בבטחה.
השיעור הבא בקורס: דיווח על פעילות - Report Progress

פרקי ההרצאה: הסבר על Async Task

  1. 00:00

    AsyncTask במקום Thread

  2. 01:00

    שלושת הטיפוסים הגנריים של AsyncTask

  3. 03:13

    התאמת המחלקה הקיימת

  4. 03:53

    הפונקציה doInBackground בתרד נפרד

  5. 04:54

    דיווח תוצאה ב-onPostExecute

  6. 06:53

    הודעה לפני התחלה ב-onPreExecute

תמלול ההרצאה: הסבר על Async Task

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

  1. 00:01

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

  2. 00:28

    תרד נפרד, אבל גם מאפשרת להדכן את ה-UI. אז בואו נראה איך עושים את זה. יש לנו כאן את המחלקה Primes Finder שבנינו מקודם, וPrimes Finder ירשה או ממשה ליתר דיוק את Runnable עבור התרד.

  3. 00:47

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

  4. 01:03

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

  5. 01:26

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

  6. 01:44

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

  7. 02:09

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

  8. 02:28

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

  9. 02:46

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

  10. 03:20

    אין לנו פה את הקונסטרקטור הזה יש לנו למעשה, לא בעצם יש לנו קונסטרקטור אבל הקונסטרקטור צריך לקבל רק את ה-callbacks אנחנו כן רוצים לדווח דברים, אין לנו את ה-end ואת ה-start האלה כאן, פונקציית run כמובן לא נמצאת, תכף אנחנו ניפטר ממנה, וה-interface כן קיים לנו.

  11. 03:49

    ומה שאנחנו רוצים לעשות זה לממש פונקציה אחת שחובה לממש אותה, והפונקציה הזאת נקראת doInBackground. בואו נממש אותה ומה שהפונקציה הזאת אומרת זה אני פועלת בתרד נפרד invoked in a different thread thus can't touch the UI ונקודה מאוד מאוד חשובה הפונקציה הזאת doing background תופעל אוטומטית כאשר אנחנו בעצם נריץ את המחלקה הזאת

  12. 04:30

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

  13. 05:01

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

  14. 05:15

    onPostExecute זאת פונקציה שתופעל אוטומטית בסיום הפעילות, אבל היא כן תורץ בטרד של ה-UI. וזה מה שמיוחד ויפה ב-AsyncTask. AsyncTask מכילה לנו בתוכה מספר פונקציות, פונקציה אחת DoingBackground רצה בטרד נפרד ומאפשרת לבצע פעילות במקביל ופונקציה אחרת OnPostExecute, כאשר המילה פוסט זה אחרי, אחרי שהאקסקיוט יתבצע והסתיים אנחנו יכולים לבצע

  15. 05:48

    פה קוד שכן ירוץ בטרד של ה-UI, Invoked in the UI's thread. ולכן כן אנחנו יכולים לגעת ב-UI ופה בעצם אנחנו רוצים לדווח את הסיום של הפעילות אז אנחנו לא נקרא לזה רק on finish, אנחנו נקרא לזה on success מפני שיכול להיות שיש לנו איזושהי בעיה באמצע ואנחנו נרצה לדווח on arrow באלגוריתם הזה לא תהיה בעיה

  16. 06:18

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

  17. 06:34

    אוקיי, אז בואו פשוט נדווח את onSuccess, זה נמצא ב-Listener, onSuccess, ונשלח את ה-String, כאשר ה-String נקרא לה Result, onS, וזה התוצאה הסופית של החישוב.

  18. 06:53

    עכשיו קיימת עוד פונקציה שאנחנו יכולים לדרוס, והפונקציה שקיימת בנוסף נקראת onPre-Execute. וonPre-Execute מתבצעת לפני onDoingBackground, יש לנו את onPre, doingBackground וonPost.

  19. 07:17

    וonPre מתבצעת גם היא בטרד של ה-UI, ולכן היא יכולה לגעת ב-UI. מה אנחנו רוצים לעשות בתוך הפונקציה on pre, אנחנו רוצים לדווח שאנחנו הולכים להתחיל, עוד לא באמת התחלנו את התהליך, אנחנו ממש עוד שנייה הולכים להתחיל את התהליך, אז בואו נבנה פה איזושהי פונקציה שנקראת on about to start, והפונקציה on about to start לא צריכה

  20. 07:45

    לקבל שום דבר, ובתוך on pre execute, כאשר pre בהקשר הזה זה לפני, נרשום listener, on about to start, ואז בעצם אנחנו מציינים למיין אקטיביטי שאנחנו ממש הולכים

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

ההרצאה הקודמת: בעיית Cross Thread

ההרצאה הבאה: דיווח על פעילות - Report Progress

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

  • הסבר על Task Manager
  • הסבר של async ועל await
  • Asynchronous - Async Call
  • Async Custom Validators

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

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