PracticU

הצורך ב-Async Task

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

הצורך ב-Async Task
קוד ארוך שרץ ישירות בקוד של כפתור תוקע את הממשק. ההרצאה מדגימה את הבעיה על חיפוש מספרים ראשוניים, ומסבירה למה צריך להריץ קוד כזה במקביל, ועם AsyncTask.
למה מריצים קוד במקביל
1. קוד שלוקח הרבה זמן: אם הוא רץ כחלק מה-activity, המסך קופא והמשתמש לא יכול לעשות כלום עד שהקוד מסתיים. בהרצה במקביל הוא ממשיך לעבוד עם האפליקציה.
2. גישה לאינטרנט: החל מגרסה מסוימת של אנדרואיד חובה לבצע אותה במקביל ולא בתוך ה-UI.
3. Thread ו-AsyncTask: Thread של Java יכול לבצע קוד במקביל, אבל בדרך כלל מעדיפים AsyncTask, וההמשך יסביר למה.
הדוגמה
1. הממשק: שני EditText למספר התחלתי וסופי, כפתור שמוצא את כל המספרים הראשוניים בטווח, ו-TextView בתוך ScrollView להצגת התוצאה.
2. הקוד בכפתור: קוראים את שני המספרים עם Long.parseLong (long, כי המשתמש עשוי להכניס מספר גדול מ-int), ורצים בלולאה for מההתחלה עד הסוף.
3. PrimesHelper.isPrime: פונקציה סטטית שמחזירה false למספר קטן או שווה ל-1. היא בודקת חלוקה ללא שארית ממספרים מ-2 ועד שורש המספר (Math.sqrt), ואם מצאה מחלק מחזירה false, ואחרת true.
4. בניית התוצאה: מספר ראשוני מצורף ל-StringBuilder עם פסיק, ובסוף התוצאה מוצגת ב-TextView עם setText.
מה קורה בהרצה
בטווח קטן, 100 עד 20,000, התוצאה מיידית. בטווח של 1,000,000 עד 2,000,000 האפליקציה נתקעת: הכפתור קפוא, ואחרי כמה שניות מופיעה הודעה שהאפליקציה לא מגיבה, עם שאלה אם לסגור אותה. אחרי 10-15 שניות ויותר התוצאה מופיעה בכל זאת. הקוד עבד נכון, אבל תקע את ה-UI.
שימו לב
כשהקוד נכתב ישירות בכפתור הוא סינכרוני: המערכת ממתינה לסיומו ורק אז משחררת את ה-UI. הפתרון הוא ביצוע אסינכרוני ברקע, ועדכון הממשק כשהעבודה מסתיימת. בהרצאה הבאה מנסים זאת עם thread רגיל ורואים מה הבעיה, ואחר כך עוברים ל-AsyncTask.
השיעור הבא בקורס: בעיית Cross Thread

פרקי ההרצאה: הצורך ב-Async Task

  1. 00:00

    למה להריץ קוד במקביל

  2. 01:18

    גישה לאינטרנט ומחלקת Thread

  3. 02:14

    אפליקציית מציאת מספרים ראשוניים

  4. 03:52

    קריאת הטווח והרצת הלולאה

  5. 05:29

    מחלקת PrimesHelper ובדיקת isPrime

תמלול ההרצאה: הצורך ב-Async Task

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

  1. 00:00

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

  2. 00:18

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

  3. 00:36

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

  4. 00:55

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

  5. 01:18

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

  6. 01:32

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

  7. 01:47

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

  8. 02:04

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

  9. 02:28

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

  10. 02:51

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

  11. 03:19

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

  12. 03:42

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

  13. 03:57

    הנה יש לנו פה את הלחצן, בואו ניכנס אליו, ויש לנו כאן למעלה את ה-edit text start number, end number, וה-text view להצגת כל המספרים, איתרנו אותם כאן, ואנחנו מעוניינים בלחצן, פשוט לרוץ מההתחלה עד הסוף ולמצוא את כל המספרים הראשונים ביניהם.

  14. 04:20

    אז בואו קודם כל נקבל את המספרים האלה, בואו ניקח כאן איזשהו משתנה long start, מפני שהיוזר יכול להכניס מספר שהוא יותר גדול, לדוגמה מ-integer. אנחנו רוצים לגשת ל-long, נקודה parse long, ולתת לו edit text start, get text, נהפוך אותו לטו-סטרינג, נשכפל את הכל גם ל-end, זה המספר הסופי, ויש לנו כאן editText end, והנה יש לנו את שני המספרים.

  15. 04:58

    מה שאנחנו רוצים לעשות זה לרוץ בלולאה, בואו נעשה for i, ואנחנו רוצים שה-i לא יהיה integer אלא יהיה long, אנחנו רוצים שהוא יתחיל מ-start ושיהיה קטן שווה ל-end, והנה יש לנו פה לולאה שסורקת את כל הטווח.

  16. 05:19

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

  17. 05:39

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

  18. 05:59

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

  19. 06:12

    אז למעשה, לפי נוסחה מתמטית, אנחנו לא צריכים לבדוק את כל המספרים משתיים עד אליו, אלא מספיק עד השורש שלו. אז בואו ניקח את math.square root. ונשלח את המספר, והנה יש לנו את השורש, זה מבחינה מתמטית יעבוד עכשיו אנחנו רוצים לרוץ על כל המספרים משתיים למעשה ועד ללימיט, קטן שווה ללימיט ולבדוק האם יש איזשהו מספר שמחלק אותו אם נעמודולו i הוא 0, מצאנו מישהו שמחלק

  20. 06:49

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

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

ההרצאה הקודמת: Animation Events

ההרצאה הבאה: בעיית Cross Thread

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

  • הסבר על Task Manager
  • Asynchronous - Async Call
  • Async Custom Validators
  • שימוש ב-Async Controller

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

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