
AsyncTask כך שידווח אחוז התקדמות בזמן הריצה, ויציג אותו למשתמש ב-TextView וב-ProgressBar.AsyncTask כותבים Integer, כי מדווחים אחוזים.percentDone כ-(i - start) / (end - start) * 100.0 וממירים ל-int. אחד המספרים חייב להיות double, אחרת החלוקה בין שלמים מאבדת את השבר.lastPercentReported ומדווחים רק כאשר האחוז שונה ממנו, כדי לא לדווח את אותו ערך אלפי פעמים.publishProgress: אסור לקרוא ל-listener מתוך doInBackground, ולכן קוראים ל-publishProgress(percentDone). הפונקציה מפעילה את onProgressUpdate, שרצה בתרד ה-UI.onProgressUpdate: מקבלת Integer... ומעבירה את values[0] ל-listener.onReportProgress(percentDone), פונקציה חדשה בממשק.onReportProgress מציגים את האחוז עם הסימן % ב-TextView נפרד, ממורכז.ProgressBar: מוסיפים אחד ל-layout ברוחב match_parent, גובה 20dp וסגנון אופקי ?android:attr/progressBarStyleHorizontal, ומעדכנים אותו ב-setProgress(percentDone). המשתמש רואה גם אחוזים וגם פס התקדמות.PrimesHelper כבר לא נחוצה. מעבירים את isPrime למחלקת PrimesFinder כפונקציה פרטית ומוחקים את המחלקה.StringBuilder קוראים ל-append פעמיים (למספר ולפסיק) ולא משרשרים עם +, כי כל שרשור יוצר אובייקט מחרוזת חדש מיותר בזיכרון.הטקסט המלא של הדקות הראשונות בהרצאה «דיווח על פעילות - Report Progress» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כעת בואו משדרג את האסינג טסק שבנינו כך שהיא תוכל לדווח משהו תוך כדי ההתקדמות של הפעילות שלה. כי הפעילות לוקחת הרבה זמן ואנחנו רוצים תוך כדי הפעילות לתת איזשהו חיווי למשתמש שמשהו מתרחש וככה א. הוא ידע לא להתחיל ללחוץ באקטיביטי על כל מיני דברים, אולי ילחץ עוד פעם ועוד פעם על הכפתור הסטארט וגם שיראה מה
הקצב ההתקדמות שאינה מתי כל הסיפור הזה הולך להסתיים. אז מה שאפשר להדכן זה או מכרוזות נניח שבאיזה שלב אנחנו נמצאים אם יש לנו כמה שלבים שאנחנו נמצאים בהם וזה לא המצב כרגע או הכי פשוט זה להדכן איזשהו קצב התקדמות או אחוז חישוב שיסתיים.
אם אנחנו יודעים כמה אחוז אנחנו כל שלב נמצאים בו, אז אנחנו יכולים להדכן את האחוז, לא תמיד אנחנו יודעים, אם לדוגמה אנחנו גולשים לאינטרנט ולאיזשהו אתר להביא זה משהו וזו פעילות שלוקחת המון זמן, אבל אני לא יודע מתי הולכת להסתיים, אני לא יכול לדווח קצב התקדמות על ידי אחוז, אבל אם יש לי לולאה שמתחילה
בשלב מסוים ושמסתיימת בשלב מסוים, אז אני כן יודע כל רגע בלולאה כמה אחוז כבר סיימתי. אז מה שאנחנו רוצים ולדווח integer זה קודם כל מה שאנחנו כותבים פה למעלה בפרמטר האמצעי שאחראי על הטיפוס שאנחנו מדווחים הדבר הבא שאנחנו רוצים זה בתוך הלולאה לחשב בכל רגע ורגע את האחוז אז יש לנו פה את הלולאה שמתחילה ומסתיימת אם מצאנו מספר ראשוני אנחנו כמובן מצרפים אותו לסטרינג בילדר
עכשיו מה שאנחנו רוצים זה בלי קשר אם המספר הוא ראשוני כן או לא בכל שלב בלולה אנחנו רוצים לחשב את הפרסנט דן בואו נניח כמה בעצם כבר סיימנו והפרסנט דן זה למעשה ה-I פחות הסטארט בואו נשים את כל זה בסוגריים לחלק ל-end פחות הסטארט את זה אנחנו צריכים להכפיל ב-100 ומה שאנחנו רוצים זה
לעטוף את הכל ולהגדיר שזה בעצם דאבל, אחד מהם לפחות, בואו נגדיר כאן 100.0, בואו נגדיר כאן דאבל, אחרת הכל אינטג'ר ואנחנו נאבד את הנקודה העשרונית ובגלל שאנחנו רוצים להכניס את זה לתוך אינטג'ר אז אנחנו רוצים אחרי שביצענו את החלוקה להבצע עוד פעם אינטג'ר.
אז יש לנו כאן איזשהו מספר שבעצם מתאר כמה אחוז החישוב הסתיים בגלל שהחישוב לא מתחיל מ-0 או מ-1 אז אנחנו צריכים לעשות פה את קצת מתמטיקה כאן בכדי לגלות בכל השלב בלולאה כמה אחוז בעצם אנחנו כבר עברנו ומה שאנחנו רוצים לעשות זה מכאן לדווח ל-UI את הקצב התקדמות את האחוז של החישוב שהסתיים
אז קודם כל אנחנו צריכים פה עוד איזה שהיא פונקציה בתוך האינטרפייס ובואו נקרא לה void on report progress שתקבל את הפרסנט done הזה ואנחנו רוצים בדיוק כאן לקרוא לה אבל אנחנו ראינו שהפונקציה on, סליחה do in background לא יכולה לגעת ב-UI ואסור לנו כאן לקרוא לפונקציות שמתבצעות ב-UI.
מה אנחנו צריכים לבצע? אנחנו צריכים לקרוא לפונקציה שנקראת Publish Progress ולתת לה את הפרסנט דן, ככה זה עובד. Publish Progress זה פונקציה שאנחנו יכולים לקרוא לה ב-Doing Background ומה שיקרה היא תגרום להעלאה של פונקציה נוספת שנקראת On Progress Update ו-On Progress Update רצה בטרד של ה-UI.
בואו נרשום את ההערה הזאת כאן ואז אנחנו יכולים לראות בעצם שפה אנחנו כן יכולים לגשת לליסנר שלנו ולקרוא ל-on report progress ולשלוח את הפרמטר הראשון אני רואה למעשה שהיא מקבלת כמה פרמטרים אז בואו ניקח int% done, זה יהיה values במקום 0, ופשוט נשלח את ה% done.
אז אנחנו רואים שככה היא מביאה לנו את המידע לדיווח, ואנחנו פשוט מדווחים אותו. עכשיו אנחנו לא רוצים לדווח את אותו מספר שדיווחנו לפני שנייה. מה זאת אומרת, הלולה הזאת ירצה מימיליון עד שתי מיליון, נניח, אבל יש רק 100% באמצע, אז אנחנו לא רוצים לדווח את המאה אחוזים האלה בעצם המון המון פעמים, 100 אלף פעם או 10 אלף פעם,
שדיווחנו כבר נניח שאנחנו ב-17% אז אין מה לדווח עוד פעם שאנחנו ב-17% ולכן מה שנעשה זה ניקח כאן איזה שהוא אינטג'ר ונקרא לו last percent reported. נכניס בתוכו 0 ואנחנו רוצים לבדוק האם ה-percent done שונה מה-last percent reported.
רק אם הוא שונה מהלאסט פרסנט ריפורטד אנחנו מעוניינים לבצע את הדיווח וכמובן להדכן את הלאסט פרסנט ריפורטד בפרסנט דן. אוקיי, אז הנה יש לנו עכשיו את כל המנגנון של דיווח קצב ההתקדמות, אחוז החישוב שהסתיים, יש לנו פה גם חישוב של האחוז וגם בדיקה שלא דיווחנו אותו כבר ואם לא דיווחנו אז אנחנו רוצים לדווח.
ובעצם יש לנו כאן את הפונקציה שמדווחת, אנחנו לא מדווחים בתוך doInBackground, אלא בפונקציה שרצה בטרד של ה-UI ורק מעוררים אותה פה. הדבר הזה יעורר את הפונקציה הזאת, ושם אנחנו כן יכולים לקרוא לפונקציות ב-UI, אבל אנחנו צריכים להגשת ל-UI ולהשלים את הפונקציה.
בואו ניגש ואימפלמנט מתוד, הוא אומר לנו יש לנו עוד פונקציה אחת, OnReportProgress, הנה היא כאן, ומה שאנחנו רוצים לעשות בפונקציה זה פשוט להציג קצב התקדמות.
בואו ניקח את הקטע קוד הזה, ופשוט נדביק את הPerCentDone, משורשר עם אחוז. אבל למעשה אנחנו מציגים את זה בתוצאה הסופית, אז בואו אולי נשכפל אותה, כל הסיפור הזה נשכפל לכאן, ונגדיר כאן משתנה אחר שנקרא percent, ניתן לו גם כן text size 20 ונאתר אותו ופשוט נדווח