
PrimesFinder: מממשת Runnable, וזה עדיף על ירושה מ-Thread. ה-constructor שומר את תחילת הטווח וסופו, ופונקציית run מכילה את אלגוריתם הראשוניים עם StringBuilder.Callbacks עם פונקציה onFinish(String primes), ופונקציית setCallbacks. בסוף run קוראים ל-listener.onFinish(...). בהמשך מעבירים את ה-listener ל-constructor.Callbacks, יוצרת PrimesFinder עם start, end ו-this, ומפעילה new Thread(...).start(). ב-onFinish מציגה את התוצאה ב-TextView.onFinish נמצאת ב-Activity, אבל נקראה מתוך run, כלומר מה-thread הנפרד, ולכן נחשב שה-thread הנפרד נגע ב-UI.AsyncTask, שמאפשר גם ריצה ברקע וגם עדכון UI באמצע. ההרצאה הבאה מציגה אותו.הטקסט המלא של הדקות הראשונות בהרצאה «בעיית Cross Thread» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אז אחרי שראינו את הבעיה בקוד שלוקח הרבה זמן לביצוע, שבעצם ה-UI נתקע לנו, וראינו בעצם שאנחנו צריכים לבצע את זה בצורה אסינכרונית, בצורה מקבילה לפעילות ה-UI, בואו קודם כל ננסה לעשות את זה עם thread.
אם אנחנו מכירים thread, אז אנחנו יודעים שthread רץ במקביל. אוקיי, אז מה הבעיה? בואו ניגש ונייצר מחלקה, בואו נקרא לה Primes Finder, ובשביל לייצר thread אנחנו צריכים or to extend thread or to implement runnable, וקצת יותר נכון יהיה to implement runnable, כי אנחנו לא צריכים באמת לרשת thread ואנחנו לא צריכים את כל מה שיש לדread,
אז בואו פשוט נבצע implement method ויש לנו פונקציה אחת שאנחנו צריכים לממש וזאת הפונקציה run, ובפונקציה הזאת אנחנו רוצים לבצע את המציאה של המספרים הראשוניים.
אז בואו נייצר כאן איזשהו קונסטרקטור, public primes finder, שיקבל את שני המספרים של הטווח, long start וlong end, יכניס אותם לאיזשהו משתנה data members כאלה, private long start וprivate long end, ואנחנו רוצים this start שווה start, אנחנו רוצים this end שווה end, ממש קונסטרקטור רגיל, בואו נעתיק את הקוד שרץ עם string builder,
כל הקוד הזה, ופשוט נזרוק את זה כאן, ואנחנו רוצים בסיום הפעילות, אנחנו רוצים לדווח למיין אקטיביטי את המכרוזת בעצם שמצאנו עם כל המספרים הראשוניים.
אז לצורך כך בואו נבנה את כל הקונספט של הליסנר, כי אנחנו רוצים בעצם לבצע איזשהו דיווח כזה. אז נגדיר פה public interface callbacks ויש לנו פונקציה אחת ונגדיר שהפונקציה הזאת היא void on finish ונדווח string rhymes ואנחנו רוצים שיהיה לנו פה אפשרות להגדיר את האינטרפייס הזה.
יש לנו פה, בואו נגדיר Private, מסוג Callbacks, נגדיר Listener, ויש לנו כאן Public Void Set Callbacks, ונקבל Callbacks Listener, This Listener שווה Listener, והנה אפשר מה-main להביא מישהו שמממש את האינטרפייס הזה, ואז בסוף של התהליך, כל מה שאנחנו רוצים לעשות זה להגיע ל-Listener ו-To Call on
Finish ולשלוח את ה-StringBuilder.ToString. אז כך, ה-MainActivity יכולה לבנות אובייקט מה-Primes Finder, לתת לו גם Callbacks וגם את ה-Start ואת ה-End, ובצורה כזאת לקבל את הדיווח, האמת שאנחנו יכולים אפילו את זה נניח לשים פה, ואז אוטומטית כשיוצרים אובייקט ממנו כבר אפשר להביא הכל.
בואו ניקח את זה נשים כאן, ניפטר מהקוד הזה, ויהיה לנו פה קצת יותר קל להפעיל את זה. אז זה בעצם המחלקה, find prime, primes finder, סליחה, והיא רצה כמובן בטרד נפרד, ואנחנו רוצים להפעיל אותה במקום לבצע את כל הקוד הזה כאן.
אז בואו ניפטר רגע מהקוד הזה, ואנחנו רוצים לבנות אובייקט מפריים finder, PRIMES FINDER, אנחנו רוצים שהקונסטרקטור שלו יקבל את ה-START, אנחנו רוצים שהוא יקבל את ה-END, ואנחנו רוצים שהוא יקבל DIS, כי אנחנו רוצים לממש את הפונקציה, וכאן בעצם אין לנו את זה פה, זה רגע נשים בהערה, בואו נממש את הפונקציה, נלחץ על ALT ENTER, MAKE MAIN
ACTIVITY IMPLEMENT CALLBACKS, הנה ה-onFinish, אוקיי, onFinish תתבצע כאשר ה-thread יסיים את הפעילות שלו, את זה נשים פה, תר מזה, ואנחנו רוצים את ה-primes שקיבלנו להציג.
כעת אנחנו רוצים להריץ את כל הסיפור הזה, אז אנחנו פותחים אובייקט thread, שווה new thread, נותנים לקונסטרקטור שלו את ה-primes finder, ופשוט אומרים, פרד נקודה סטארט, וזה קריאה אסינכרונית, וברגע שאנחנו מבצעים את הסטארט, אז התוכנית לא נתקעת, היא תמשיך ואז היא תסיים את הלחצן, ברגע שהיא מסיים את הלחצן,
אז הקוד וה-UI משתחררים, והיוזר יכול לעבוד בצורה רגילה עם האפליקציה, כמובן הוא יראה את המידע, או שאמור