
TextDownloader שמקבל כתובת URL, גולש אליה ברקע, מוריד את הטקסט ומציג אותו, ומדווח בנפרד על הצלחה ועל שגיאה.AsyncTask מתאים כי הוא גם מריץ ברקע וגם מאפשר לעדכן את ה-UI בסוף. Thread רגיל לא יכול להציג את המידע במסך. המחלקה גנרית ואינה תלויה ב-API מסוים, ולכן אפשר להשתמש בה שוב בהרצאות הבאות.AsyncTask<String, Void, String>. מקבלים String, כתובת היעד. לא מדווחים התקדמות, כי בגלישה לאתר מרוחק לא יודעים כמה נשאר. התוצאה היא String עם הטקסט שהורד.Callbacks: onAboutToBegin, onSuccess(String downloadedText) ו-onError(int httpStatusCode, String errorMessage). ב-constructor מקבלים listener. בשדות שומרים httpStatusCode ו-errorMessage.onPreExecute: קוראת ל-listener.onAboutToBegin().HttpURLConnection להתחברות ולקבלת התשובה, ו-InputStream, InputStreamReader ו-BufferedReader לקריאת התוכן. BufferedReader נותן את readLine, שקל יותר מקריאת בתים או תווים בודדים.try: לוקחים את הקישור מ-params[0], בונים URL, קוראים ל-openConnection ומבצעים cast ל-HttpURLConnection. קוראים ל-getResponseCode. אם הוא שונה מ-HttpURLConnection.HTTP_OK שומרים את getResponseMessage ב-errorMessage ומחזירים null.getInputStream, עוטפים ב-reader וב-BufferedReader, וקוראים שורה אחר שורה בלולאה while עד null, ומצרפים ל-StringBuilder עם \n. מחזירים את toString().catch: שומרים את ex.getMessage() ב-errorMessage, שעשוי להיות null, ומחזירים null. אסור לקרוא ל-onError מכאן, כי doInBackground רצה בתרד נפרד.finally: בודקים כל אחד מהרכיבים שאינו null, ו-disconnect על החיבור ו-close על כל אחד מהשאר, כל אחד בנפרד.onPostExecute: אם הטקסט שהורד אינו null, קוראת ל-onSuccess, ואחרת ל-onError. בודקים את הטקסט ולא את errorMessage, כי ה-message יכול להיות null גם בשגיאה.TextView, בונה TextDownloader וקורא ל-execute. ב-onAboutToBegin מציגים ProgressDialog (כותרת Downloading, הודעה Please wait ואייקון), כדי שהמשתמש ידע שמשהו קורה. ב-onSuccess מסירים את הדיאלוג ומציגים את הטקסט, וב-onError מסירים אותו ומציגים את הקוד וההודעה. הפונקציות האלה רצות בתרד ה-UI, ולכן מותר בהן לגעת במסך. ההרשאה לאינטרנט מוגדרת ב-manifest כ-Normal Permission.הטקסט המלא של הדקות הראשונות בהרצאה «הורדה פשוטה - Download» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
מגיעים לנושא חדש שנקרא נטוורקים. בנושא הזה אנחנו הולכים לראות איך אנחנו יכולים לבנות אפליקציה שניגשת לאינטרנט. אנחנו יכולים לגלוש לאיזשהו ריסורס באינטרנט או לאיזשהו לינק באינטרנט מכדי לקבל ממנו מידע.
בדרך כלל אם אנחנו עושים את זה אז נחשב שאנחנו גולשים ל-API, Application Programming Interface. משהו שאיזשהו אתר חושף עבור כל העולם ואנחנו יכולים לצרוך את המידע הזה על ידי האפליקציה שלנו לדוגמה אנחנו יכולים לגלוש לגוגל פייננס יש להם איזשהו API שחושף מידע לגבי מניות בזמן
אמת וכך אנחנו יכולים להציג באפליקציה שלנו נתונים לגבי מניות אנחנו יכולים לגלוש לאיזשהו API של אתר מטאורולוגיה שחושף את המזג האוויר הנוכחי בכל מיני מקומות בעולם ולהציג את זה באפליקציה שלנו אז כל פעם שאנחנו רוצים לגלוש לאן שהוא בעולם ולקבל מידע אנחנו בעצם צריכים לדעת איך
לעשות את זה על גבי רשת האינטרנט מה עם הרכיבים שאנחנו צריכים להשתמש איתם באפליקציה ואיך בעצם כל הסיפור הזה בנוי מבחינתנו באנדרואיד אז קודם כל בסרטון הראשון אנחנו הולכים לראות איך אנחנו הולכים לבצע קטע קוד שפשוט גולש לאן שהוא באינטרנט אנחנו ניתן לו סתם איזה שהוא לינק
והוא פשוט מוריד את מה שיש בלינק הזה בסרטונים הבאים נראה איך אנחנו יכולים להשתמש עם אותו רכיב שאנחנו בונים בכדי לגשת כבר לאיזשהו API ספציפי ולקבל מידע עם יותר משמעות אז קודם כל יש לנו כאן איזשהו layout שאומר למשתמש תן לי כאן איזושהי כתובת URL כלשהי ותלחץ על הלחצן ואני פשוט יוריד לך את כל מה שיש בכתובת הזאת ואני אשים לך כאן בתיבת הטקסט.
במילים אחרות בוא תגלוש לדף אינטרנט כלשהו נניח ואני אוריד לך את הטקסט של הדף ויציג לך אותו פה אנחנו מבצעים גלישה לדף, מקבלים בחזרה את הדף ואני כרגע לא מציג אותו כדף אינטרנט אלא רק מידע טקסטואלי טהור לצורך כך אנחנו רוצים לבנות איזשהו רכיב שמוריד טקסט
אם אני נותן לו איזשהו לינק הוא גולש ללינק והלינק מחזיר לי מידע טקסטואלי והוא פשוט מביא לי את הטקסט שהיה קיים בלינק או שהלינק החזיר לנו אנחנו לא משתמשים עם הרכיב הזה בשביל להוריד לדוגמא תמונות אבל רוב המידע שאנחנו גולשים אליו בעולם האינטרנט הוא מידע טקסטואלי גם אם אנחנו רוצים להוריד לדוגמה המידע לגבי מניות אנחנו גולשים ל-API של מניות ומקבלים טקסט לגבי המניות
אז אנחנו נוכל להשתמש בטכניקה הזאת בשביל לבצע את זה אז מה שאנחנו צריכים להבין קודם כל זה שמי גרסה מסוימת של אנדוריד אי אפשר לבצע גלישה לרשת כקוד שנכתב בתוך אקטיביטי מפני שגלישה לרשת לאינטרנט יכולה לקחת זמן והדבר הזה יכול לתקוע את הפעילות של האקטיביטי אז מאיזושהי גרסה פשוט חסמו את זה
ואמרו אם אתם רוצים לבצע גלישה לאינטרנט אתם צריכים לבצע את זה בהפרד נפרד וכמובן שעדיף לצורך כך להשתמש באסינג טאסק שלמדנו בנושא של האסינג טאסק.
למה? כי אני גם רוצה שהפעילות הזאת תתבצע ברקע כי היא פשוט יכולה לקחת הרבה זמן. אני תלוי פה בקו אינטרנט, אני תלוי פה בשרת מרוחק ובפעילות שלו ובכמה זמן שלוקח לו להחזיר לי את המידע.
וגם אני רוצה להדכן את ה-UI, אני רוצה שברגע שסיימתי להביא את הדאטה כמובן אני עושה איתו חישובים ומציג אותו אז אני רוצה שתהיה לי גם את האפשרות להציג את ה-UI, להשתמש סתם בטרד רגיל ב-Java לא יעזור לי להציג את המידע בסופו של דבר ב-UI כי אני לא יכול להציג את המידע ב-UI אם אני נמצא בטרד נפרד רגיל לגמרי אז כאן אנחנו הולכים להשתמש
ב-AsyncTask בשביל להצליח לבצע את זה. אז בואו כבר בשלב הזה נצרף מחלקה חדשה שתראה שמה-AsyncTask, בואו נקרא למחלקה הזאת TextDownloader, ואנחנו נשתמש במחלקה הזאת גם בסרטונים הבאים, בכדי להוריד טקסטים מכל מיני API'ים שונים באינטרנט.
אז בואו נצרף את המחלקה ואנחנו רוצים to extend את AsyncTask, וכאמור אם כמובן לא ראיתם את הסרטונים לגבי AsyncTask זה חובה לראות אותם לפני הסרטון הזה אז ב-AsyncTask אנחנו רוצים לדעת מה המידע שאנחנו מקבלים מהUI שלנו מהאקטיביטי ומה המידע שאנחנו מדווחים ומה התוצאה הסופית שאנחנו מחזירים ושלושה דברים שאנחנו צריכים
להביא למחלקה AsyncTask הג'נרית אז אנחנו רוצים לקבל מהאקטיביטי string שמתארת את ה-URL אליו אנחנו רוצים לגלוש בשביל להביא דייטה.
אנחנו לא רוצים לדווח דבר במהלך הפעילות, למה? כי אין לנו פה איזושהי לולאה שבה אנחנו רוצים בשביל להוריד מידע מהאינטרנט וכך אנחנו יכולים אולי לדעת באיזה שלב או מה אחוז החישוב שיסתיים.
מפני שאנחנו הולכים לבצע גלישה מרוחקת לאינטרנט ואחזרת מידע אז אנחנו לא יודעים תוך כדי הגלישה לאתר המרוחק כמה זמן עוד נשאר לנו לבצע את התהליך ולכן אנחנו נדווח כביכול void, כלומר אנחנו לא מדווחים שום דבר בתהליך עצמו אלא מדווחים דבר אחד בסיום התהליך וזה ה-result string מה זה? זה בעצם המידע שהבנו מהאתר המרוחק ומה שיפה כאן זה שהמחלקה
הזאת שאנחנו בונים כרגע Text Downloader אומרת לנו אני מביאה לכם טקסט תנו לי איזשהו לינק לאתר מרוחק אני אגלוש אליו, אני אביא לכם את הטקסט שהוא הביא לי אני לא יודעת מה הוא הביא לי זה מה שיפה כי אנחנו יכולים להשתמש עם המחלקה הזאת בכל מיני אפליקציות שונות
ובכל מיני לוגיקות שונות או כל מיני רעיונות להוואת מידע שונה מ-API שונים, והכל אפשר לבצע דרך המחלקה הספציפית הזאת. בקיצור, אנחנו כותבים אותה פעם אחת, ונוכל להשתמש איתה עבור הרבה פרויקטים אחרים.
אז בואו נבצע Implement Methods, וכאמור יש לנו רק מתודה אחת שאנחנו חייבים לממש, וזה ה-Doing Background, אבל כמו שראינו בסרטונים של האסינג טאסק, אנחנו הולכים לדרוס עוד פונקציות.
ויש לנו פה את ה-DoInBackground בצורה כזאת, ובואו נסתכל מה עוד אנחנו רוצים. אז קודם כל אנחנו רוצים גם את OnPre-Execute, ו-OnPre-Execute כאמור תתבצע לפני DoInBackground, ובה אנחנו רוצים לומר ל-UI שאנחנו עוד שנייה הולכים להתחיל את התהליך, ואנחנו רוצים גם את onPostExecute, שonPostExecute מקבלת את התוצאה הסופית שהורדה מהאינטרנט.
זה בעצם, ה-S הזאת נקרא לה Downloaded Text, הטקסט שכבר הורדנו מהאתר המרוחק. אותו אנחנו רוצים להחזיר בחזרה. ואנחנו רוצים שיהיה לנו פה איזשהו קונסטרקטור, public text downloader, שיקבל איזשהו callbacks, שהcallbacks לפי מה שראינו בסרטון של ה-AsyncTask, זה interface, בואו נבנה אותו כאן,
callbacks, שיש לו כמה פונקציות שמתארות את התהליך שבעצם מתרחש בתוך ה-AsyncTask שאנחנו בונים. יש לו כאן פונקציה onAboutToBegin נקרא לה, אנחנו הולכים להתחיל, יש לנו פונקציה onSuccess ויש לנו, היא מקבלת בעצם את הדאונלודד טקסט והפונקציה הזאת, התפקיד שלה זה לדווח בעצם את הטקסט ברגע שהצלחנו להוריד אותו, שהייתה בעצם הצלחה ולא כישלון
ולבסוף יש לנו עוד פונקציה שנקראת On Error והפונקציה הזאת תדווח בעצם את השגיאה עם התרחשה שגיאה בתרגיל שעשינו עם האסינג טאסק היה לנו שם מציעה של מספרים ראשוניים ולא היה לנו שום מצב שבו יכולה להיות שגיאה ולכן לא דיווחנו על איזושהי בעיה כאשר אנחנו גולשים לאינטרנט יכולות להיות כמה בעיות בתהליך הזה של גלישה לאינטרנט
מהאפליקציה ולכן אנחנו בעצם צריכים לדווח שהייתה בעיה אם כמובן הייתה בעיה אנחנו נראה איך בדיוק אנחנו עושים את זה עכשיו בואו שנייה אחת נדבר על תהליך הגלישה לאתר מרוחק כאשר אנחנו מבצעים גלישה באינטרנט וזה לא משנה אם אנחנו נמצאים באפליקציית אנדרואיד או באפליקציה אחרת על מכשיר נייד, או סתם דרך דפדפן על מחשב רגיל לגמרי,
ואנחנו מבצעים גלישה לאתר מרוחק. כאשר אנחנו גולשים לאתר מרוחק, זה נקרא Request. Request זה הבקשה שאנחנו שולחים לאתר המרוחק.
והבקשה הזאת כוללת בתוכה כל מיני נתונים לגבי מה בעצם אנחנו רוצים מהאתר המרוחק. מהי הכתובת שאנחנו גולשים אליה, באיזה דפדפן אנחנו או איזה נתונים יש עלינו בתור לקוח ועוד כל מיני נתונים שהמערכת תדע מה אנחנו בעצם רוצים בחזרה.
כאשר אנחנו מקבלים את התשובה מהאתר המרוחק, התשובה נקראת response. הרesponse זה מידע טקסטואלי שמכיל כל מיני נתונים שיוחזרו בחזרה. אם לדוגמה אנחנו עשינו request ל-API שמחזיר מזג אוויר, אז הרספונס שחוזר בחזרה יחזיק בתוכו או יחיל בתוכו את נתוני המזג אוויר.
איזה עיר, איזה מדינה, מה המזג אוויר, מה הטמפרטורה וכדומה. אם קול היה בסדר וקיבלנו בחזרה תשובה מהשרת, אז לכל תשובה בעצם, גם אם זה היה בסדר וגם אם לא בסדר, לכל תשובה שאנחנו מקבילים בחזרה מהשרת יש קוד, הקוד נקרא http status code, אם הקוד הזה הוא מתחיל ב-2, כלומר 200 כלשהו, 200, 201, 200 וכדומה, זה אומר שהיה הצלחה ב-request
שעשינו ואכן קיבלנו את המידע שאנחנו צריכים לקבל אם הקוד הזה הוא קוד אחר, אז בעצם יכולה להיות איזושהי שגיאה. לדוגמה, קוד שמתחיל ב-4 זה שגיאה שקרה מבחינת הלקוח.
לדוגמה, 404 זה אומר שהלקוח שלח או ביקש דף שלא קיים. 403 זה אומר שהלקוח מנסה לגלוש למקום שאסור לו לגלוש אליו.