PracticU

דיווח על פעילות - Report Progress

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › דיווח על פעילות - Report Progress
מילון מושגים:
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
Integer - סוג נתונים למספר שלם, כלומר מספר ללא חלק עשרוני.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
לייאאוט - ארגון וסידור הרכיבים החזותיים על המסך או בדף, כמו מיקום כפתורים, טקסט ותמונות.
Android - מערכת הפעלה מבוססת Linux לטלפונים ולמכשירים ניידים, שפותחה על ידי גוגל.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.

דיווח על פעילות - Report Progress
שדרוג ה-AsyncTask כך שידווח אחוז התקדמות בזמן הריצה, ויציג אותו למשתמש ב-TextView וב-ProgressBar.
השלבים העיקריים
1. שינוי הטיפוס האמצעי: בפרמטר השני של AsyncTask כותבים Integer, כי מדווחים אחוזים.
2. חישוב האחוז: בלולאה מחשבים percentDone כ-(i - start) / (end - start) * 100.0 וממירים ל-int. אחד המספרים חייב להיות double, אחרת החלוקה בין שלמים מאבדת את השבר.
3. רק כשהערך משתנה: שומרים lastPercentReported ומדווחים רק כאשר האחוז שונה ממנו, כדי לא לדווח את אותו ערך אלפי פעמים.
4. publishProgress: אסור לקרוא ל-listener מתוך doInBackground, ולכן קוראים ל-publishProgress(percentDone). הפונקציה מפעילה את onProgressUpdate, שרצה בתרד ה-UI.
5. onProgressUpdate: מקבלת Integer... ומעבירה את values[0] ל-listener.onReportProgress(percentDone), פונקציה חדשה בממשק.
6. תצוגה: ב-onReportProgress מציגים את האחוז עם הסימן % ב-TextView נפרד, ממורכז.
7. ProgressBar: מוסיפים אחד ל-layout ברוחב match_parent, גובה 20dp וסגנון אופקי ?android:attr/progressBarStyleHorizontal, ומעדכנים אותו ב-setProgress(percentDone). המשתמש רואה גם אחוזים וגם פס התקדמות.
ייעולים
1. איחוד מחלקות: PrimesHelper כבר לא נחוצה. מעבירים את isPrime למחלקת PrimesFinder כפונקציה פרטית ומוחקים את המחלקה.
2. פחות אובייקטים: ב-StringBuilder קוראים ל-append פעמיים (למספר ולפסיק) ולא משרשרים עם +, כי כל שרשור יוצר אובייקט מחרוזת חדש מיותר בזיכרון.
מגבלה
אפשר לדווח אחוז רק כשיודעים את אורך העבודה, כמו לולאה עם התחלה וסוף. בגלישה לאתר לא ידוע מתי זה יסתיים, ואז אי אפשר לדווח אחוז.
בהרצאה הבאה רואים איך המשתמש מבטל את המשימה באמצע.
השיעור הבא בקורס: ביטול משימה אסינכרונית

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

  1. 00:00

    למה לדווח קצב התקדמות

  2. 01:14

    חישוב אחוז ההתקדמות בלולאה

  3. 03:10

    הוספת onReportProgress לממשק

  4. 03:54

    publishProgress ו-onProgressUpdate

  5. 04:58

    מניעת דיווח כפול של אותו אחוז

  6. 06:40

    הצגת האחוז ב-MainActivity

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

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

  1. 00:00

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

  2. 00:26

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

  3. 00:48

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

  4. 01:08

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

  5. 01:42

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

  6. 02:20

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

  7. 02:51

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

  8. 03:20

    אז קודם כל אנחנו צריכים פה עוד איזה שהיא פונקציה בתוך האינטרפייס ובואו נקרא לה void on report progress שתקבל את הפרסנט done הזה ואנחנו רוצים בדיוק כאן לקרוא לה אבל אנחנו ראינו שהפונקציה on, סליחה do in background לא יכולה לגעת ב-UI ואסור לנו כאן לקרוא לפונקציות שמתבצעות ב-UI.

  9. 03:49

    מה אנחנו צריכים לבצע? אנחנו צריכים לקרוא לפונקציה שנקראת Publish Progress ולתת לה את הפרסנט דן, ככה זה עובד. Publish Progress זה פונקציה שאנחנו יכולים לקרוא לה ב-Doing Background ומה שיקרה היא תגרום להעלאה של פונקציה נוספת שנקראת On Progress Update ו-On Progress Update רצה בטרד של ה-UI.

  10. 04:20

    בואו נרשום את ההערה הזאת כאן ואז אנחנו יכולים לראות בעצם שפה אנחנו כן יכולים לגשת לליסנר שלנו ולקרוא ל-on report progress ולשלוח את הפרמטר הראשון אני רואה למעשה שהיא מקבלת כמה פרמטרים אז בואו ניקח int% done, זה יהיה values במקום 0, ופשוט נשלח את ה% done.

  11. 04:52

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

  12. 05:24

    שדיווחנו כבר נניח שאנחנו ב-17% אז אין מה לדווח עוד פעם שאנחנו ב-17% ולכן מה שנעשה זה ניקח כאן איזה שהוא אינטג'ר ונקרא לו last percent reported. נכניס בתוכו 0 ואנחנו רוצים לבדוק האם ה-percent done שונה מה-last percent reported.

  13. 05:53

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

  14. 06:20

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

  15. 06:44

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

  16. 06:57

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

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

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

ההרצאה הבאה: ביטול משימה אסינכרונית

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

  • הצגת Progress alert ב-Xcode

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

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