PracticU

בעיית Cross Thread

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

בעיית Cross Thread
מנסים להריץ את חיפוש המספרים הראשוניים ב-thread נפרד. ה-UI אכן לא נתקע, אבל האפליקציה קורסת ברגע שה-thread מנסה לעדכן את המסך.
מה עושים
1. מחלקה PrimesFinder: מממשת Runnable, וזה עדיף על ירושה מ-Thread. ה-constructor שומר את תחילת הטווח וסופו, ופונקציית run מכילה את אלגוריתם הראשוניים עם StringBuilder.
2. דיווח בסוף: מגדירים ממשק Callbacks עם פונקציה onFinish(String primes), ופונקציית setCallbacks. בסוף run קוראים ל-listener.onFinish(...). בהמשך מעבירים את ה-listener ל-constructor.
3. ה-Activity: מממשת את Callbacks, יוצרת PrimesFinder עם start, end ו-this, ומפעילה new Thread(...).start(). ב-onFinish מציגה את התוצאה ב-TextView.
4. הרצה: עם טווח של מיליון עד שני מיליון ה-UI משתחרר ואפשר להמשיך להשתמש באפליקציה, אבל היא קורסת בסוף.
למה זה קורס
ההודעה היא שרק ה-thread המקורי שיצר את ה-view hierarchy יכול לגעת ב-views שלו. בכל מערכות ה-UI (Java, .NET, C#, ווב) יש thread אחד שמנהל את ה-UI, ורק הוא רשאי לעדכן אותו. הפונקציה onFinish נמצאת ב-Activity, אבל נקראה מתוך run, כלומר מה-thread הנפרד, ולכן נחשב שה-thread הנפרד נגע ב-UI.
שימו לב
Thread רגיל מתאים אם אין צורך לעדכן את ה-UI בסוף, למשל כששומרים תוצאה לקובץ או שולחים אותה לאינטרנט. כשצריך לעדכן את המסך, צריך את AsyncTask, שמאפשר גם ריצה ברקע וגם עדכון UI באמצע. ההרצאה הבאה מציגה אותו.
השיעור הבא בקורס: הסבר על Async Task

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

  1. 00:00

    מחלקת PrimesFinder עם Runnable

  2. 01:00

    בניית קונסטרקטור לטווח המספרים

  3. 02:01

    ממשק Callbacks לדיווח התוצאה

  4. 04:11

    מימוש onFinish ב-MainActivity

  5. 05:19

    הפעלת החישוב עם thread.start

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

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

  1. 00:00

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

  2. 00:19

    אם אנחנו מכירים thread, אז אנחנו יודעים שthread רץ במקביל. אוקיי, אז מה הבעיה? בואו ניגש ונייצר מחלקה, בואו נקרא לה Primes Finder, ובשביל לייצר thread אנחנו צריכים or to extend thread or to implement runnable, וקצת יותר נכון יהיה to implement runnable, כי אנחנו לא צריכים באמת לרשת thread ואנחנו לא צריכים את כל מה שיש לדread,

  3. 00:48

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

  4. 01:05

    אז בואו נייצר כאן איזשהו קונסטרקטור, public primes finder, שיקבל את שני המספרים של הטווח, long start וlong end, יכניס אותם לאיזשהו משתנה data members כאלה, private long start וprivate long end, ואנחנו רוצים this start שווה start, אנחנו רוצים this end שווה end, ממש קונסטרקטור רגיל, בואו נעתיק את הקוד שרץ עם string builder,

  5. 01:50

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

  6. 02:08

    אז לצורך כך בואו נבנה את כל הקונספט של הליסנר, כי אנחנו רוצים בעצם לבצע איזשהו דיווח כזה. אז נגדיר פה public interface callbacks ויש לנו פונקציה אחת ונגדיר שהפונקציה הזאת היא void on finish ונדווח string rhymes ואנחנו רוצים שיהיה לנו פה אפשרות להגדיר את האינטרפייס הזה.

  7. 02:43

    יש לנו פה, בואו נגדיר Private, מסוג Callbacks, נגדיר Listener, ויש לנו כאן Public Void Set Callbacks, ונקבל Callbacks Listener, This Listener שווה Listener, והנה אפשר מה-main להביא מישהו שמממש את האינטרפייס הזה, ואז בסוף של התהליך, כל מה שאנחנו רוצים לעשות זה להגיע ל-Listener ו-To Call on

  8. 03:25

    Finish ולשלוח את ה-StringBuilder.ToString. אז כך, ה-MainActivity יכולה לבנות אובייקט מה-Primes Finder, לתת לו גם Callbacks וגם את ה-Start ואת ה-End, ובצורה כזאת לקבל את הדיווח, האמת שאנחנו יכולים אפילו את זה נניח לשים פה, ואז אוטומטית כשיוצרים אובייקט ממנו כבר אפשר להביא הכל.

  9. 03:58

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

  10. 04:22

    אז בואו ניפטר רגע מהקוד הזה, ואנחנו רוצים לבנות אובייקט מפריים finder, PRIMES FINDER, אנחנו רוצים שהקונסטרקטור שלו יקבל את ה-START, אנחנו רוצים שהוא יקבל את ה-END, ואנחנו רוצים שהוא יקבל DIS, כי אנחנו רוצים לממש את הפונקציה, וכאן בעצם אין לנו את זה פה, זה רגע נשים בהערה, בואו נממש את הפונקציה, נלחץ על ALT ENTER, MAKE MAIN

  11. 05:00

    ACTIVITY IMPLEMENT CALLBACKS, הנה ה-onFinish, אוקיי, onFinish תתבצע כאשר ה-thread יסיים את הפעילות שלו, את זה נשים פה, תר מזה, ואנחנו רוצים את ה-primes שקיבלנו להציג.

  12. 05:19

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

  13. 05:52

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

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

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

ההרצאה הבאה: הסבר על Async Task

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

  • יצירת תהליכון - Thread
  • בעיית ה-Callback Hell
  • בעיית ספירה לאינסוף
  • Cross-Component Communication - Observable

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

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