PracticU

הורדה פשוטה - Download

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA › הורדה פשוטה - Download
מילון מושגים:
URL - הכתובת שמזהה משאב באינטרנט, למשל דף אתר, וכוללת פרוטוקול, שם מארח ונתיב.
Activity - ב-Android, רכיב שמייצג מסך יחיד של האפליקציה שאיתו המשתמש מתקשר.
תהליכון - יחידת ביצוע בתוך תהליך, המאפשרת להריץ כמה מהלכים במקביל ולחלוק את אותו זיכרון.
API - ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
תגובה - המידע שהשרת מחזיר ללקוח בתשובה לבקשה, הכולל בדרך כלל נתונים וקוד סטטוס.
קוד סטטוס - מספר שהשרת מחזיר בתגובת HTTP ומציין את תוצאת הבקשה, למשל 200 להצלחה או 404 לא נמצא.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.

הורדה פשוטה - Download
פותחים את נושא הרשת באנדרואיד: בונים רכיב TextDownloader שמקבל כתובת URL, גולש אליה ברקע, מוריד את הטקסט ומציג אותו, ומדווח בנפרד על הצלחה ועל שגיאה.
למה AsyncTask
מגרסה מסוימת של אנדרואיד אי אפשר לגלוש לרשת מקוד שרץ ב-Activity, כי גלישה יכולה להימשך זמן ולתקוע את ה-UI. צריך לעשות זאת בתרד נפרד, ו-AsyncTask מתאים כי הוא גם מריץ ברקע וגם מאפשר לעדכן את ה-UI בסוף. Thread רגיל לא יכול להציג את המידע במסך. המחלקה גנרית ואינה תלויה ב-API מסוים, ולכן אפשר להשתמש בה שוב בהרצאות הבאות.
רקע על בקשות HTTP
הבקשה היא Request, והתשובה Response. לכל תשובה יש HTTP status code. קוד שמתחיל ב-2 (200, 201) הוא הצלחה, קוד שמתחיל ב-4 הוא שגיאה מצד הלקוח (404 דף לא קיים, 403 אסור), וקוד שמתחיל ב-5 הוא שגיאה בצד השרת, למשל קריסה.
השלבים העיקריים
1. הטיפוסים: AsyncTask<String, Void, String>. מקבלים String, כתובת היעד. לא מדווחים התקדמות, כי בגלישה לאתר מרוחק לא יודעים כמה נשאר. התוצאה היא String עם הטקסט שהורד.
2. ממשק Callbacks: onAboutToBegin, onSuccess(String downloadedText) ו-onError(int httpStatusCode, String errorMessage). ב-constructor מקבלים listener. בשדות שומרים httpStatusCode ו-errorMessage.
3. onPreExecute: קוראת ל-listener.onAboutToBegin().
4. אובייקטים לגלישה: HttpURLConnection להתחברות ולקבלת התשובה, ו-InputStream, InputStreamReader ו-BufferedReader לקריאת התוכן. BufferedReader נותן את readLine, שקל יותר מקריאת בתים או תווים בודדים.
5. try: לוקחים את הקישור מ-params[0], בונים URL, קוראים ל-openConnection ומבצעים cast ל-HttpURLConnection. קוראים ל-getResponseCode. אם הוא שונה מ-HttpURLConnection.HTTP_OK שומרים את getResponseMessage ב-errorMessage ומחזירים null.
6. קריאת התוכן: getInputStream, עוטפים ב-reader וב-BufferedReader, וקוראים שורה אחר שורה בלולאה while עד null, ומצרפים ל-StringBuilder עם \n. מחזירים את toString().
7. catch: שומרים את ex.getMessage() ב-errorMessage, שעשוי להיות null, ומחזירים null. אסור לקרוא ל-onError מכאן, כי doInBackground רצה בתרד נפרד.
8. finally: בודקים כל אחד מהרכיבים שאינו null, ו-disconnect על החיבור ו-close על כל אחד מהשאר, כל אחד בנפרד.
9. onPostExecute: אם הטקסט שהורד אינו null, קוראת ל-onSuccess, ואחרת ל-onError. בודקים את הטקסט ולא את errorMessage, כי ה-message יכול להיות null גם בשגיאה.
ב-Activity
הכפתור קורא את ה-URL, מנקה את ה-TextView, בונה TextDownloader וקורא ל-execute. ב-onAboutToBegin מציגים ProgressDialog (כותרת Downloading, הודעה Please wait ואייקון), כדי שהמשתמש ידע שמשהו קורה. ב-onSuccess מסירים את הדיאלוג ומציגים את הטקסט, וב-onError מסירים אותו ומציגים את הקוד וההודעה. הפונקציות האלה רצות בתרד ה-UI, ולכן מותר בהן לגעת במסך. ההרשאה לאינטרנט מוגדרת ב-manifest כ-Normal Permission.
בדיקה
בכתובת מלאה של practicu.com מופיע קוד הדף. בכתובת שלא קיימת מתקבלת שגיאה עם קוד 0 והודעה על חוסר כתובת למארח. google.com עובד וההורדה מציגה את הקוד.
אפשר להשתמש ברכיב הזה כבסיס להורדת מידע מכל API, ובהרצאות הבאות משתמשים בו כדי לקבל נתונים אמיתיים.
השיעור הבא בקורס: Zen Wisdom

פרקי ההרצאה: הורדה פשוטה - Download

  1. 00:00

    גישה לאינטרנט ושימוש ב-API

  2. 01:29

    אפליקציה להורדת טקסט מכתובת URL

  3. 02:48

    למה הגלישה חייבת לרוץ ב-AsyncTask

  4. 04:21

    יצירת מחלקת TextDownloader

  5. 06:50

    מימוש doInBackground ופונקציות נוספות

  6. 07:51

    ממשק Callbacks עם onSuccess ו-onError

  7. 09:33

    מהם Request ו-Response

  8. 11:08

    קודי HTTP Status

תמלול ההרצאה: הורדה פשוטה - Download

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

  1. 00:01

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

  2. 00:19

    בדרך כלל אם אנחנו עושים את זה אז נחשב שאנחנו גולשים ל-API, Application Programming Interface. משהו שאיזשהו אתר חושף עבור כל העולם ואנחנו יכולים לצרוך את המידע הזה על ידי האפליקציה שלנו לדוגמה אנחנו יכולים לגלוש לגוגל פייננס יש להם איזשהו API שחושף מידע לגבי מניות בזמן

  3. 00:45

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

  4. 01:06

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

  5. 01:27

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

  6. 01:59

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

  7. 02:24

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

  8. 02:53

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

  9. 03:19

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

  10. 03:33

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

  11. 03:48

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

  12. 04:15

    ב-AsyncTask בשביל להצליח לבצע את זה. אז בואו כבר בשלב הזה נצרף מחלקה חדשה שתראה שמה-AsyncTask, בואו נקרא למחלקה הזאת TextDownloader, ואנחנו נשתמש במחלקה הזאת גם בסרטונים הבאים, בכדי להוריד טקסטים מכל מיני API'ים שונים באינטרנט.

  13. 04:36

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

  14. 05:08

    להביא למחלקה AsyncTask הג'נרית אז אנחנו רוצים לקבל מהאקטיביטי string שמתארת את ה-URL אליו אנחנו רוצים לגלוש בשביל להביא דייטה.

  15. 05:22

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

  16. 05:42

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

  17. 06:16

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

  18. 06:36

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

  19. 06:52

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

  20. 07:06

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

  21. 07:42

    זה בעצם, ה-S הזאת נקרא לה Downloaded Text, הטקסט שכבר הורדנו מהאתר המרוחק. אותו אנחנו רוצים להחזיר בחזרה. ואנחנו רוצים שיהיה לנו פה איזשהו קונסטרקטור, public text downloader, שיקבל איזשהו callbacks, שהcallbacks לפי מה שראינו בסרטון של ה-AsyncTask, זה interface, בואו נבנה אותו כאן,

  22. 08:18

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

  23. 09:00

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

  24. 09:33

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

  25. 10:01

    ואנחנו מבצעים גלישה לאתר מרוחק. כאשר אנחנו גולשים לאתר מרוחק, זה נקרא Request. Request זה הבקשה שאנחנו שולחים לאתר המרוחק.

  26. 10:11

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

  27. 10:33

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

  28. 10:59

    איזה עיר, איזה מדינה, מה המזג אוויר, מה הטמפרטורה וכדומה. אם קול היה בסדר וקיבלנו בחזרה תשובה מהשרת, אז לכל תשובה בעצם, גם אם זה היה בסדר וגם אם לא בסדר, לכל תשובה שאנחנו מקבילים בחזרה מהשרת יש קוד, הקוד נקרא http status code, אם הקוד הזה הוא מתחיל ב-2, כלומר 200 כלשהו, 200, 201, 200 וכדומה, זה אומר שהיה הצלחה ב-request

  29. 11:30

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

  30. 11:46

    לדוגמה, 404 זה אומר שהלקוח שלח או ביקש דף שלא קיים. 403 זה אומר שהלקוח מנסה לגלוש למקום שאסור לו לגלוש אליו.

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

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

ההרצאה הבאה: Zen Wisdom

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

  • הורדה של Ubuntu
  • הורדה של Veeam
  • הורדה של Kali
  • הורדה של שרת 2019

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

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