
TextDownloader ל-ImageDownloader, כדי להוריד מקישור מרוחק תמונה במקום טקסט ולהציג אותה ב-ImageView.ImageDownloader. הקלט נשאר String, כתובת התמונה, ובמקום התוצאה String כותבים Bitmap. כך גם ב-doInBackground, ב-onPostExecute וב-onSuccess(Bitmap downloadedBitmap).HttpURLConnection ו-InputStream. InputStreamReader, BufferedReader ו-StringBuilder מיותרים, כי הם נועדו לקריאת שורות טקסט, ומוחקים אותם גם מה-finally.getResponseMessage ומחזירים null, וב-onPostExecute null מוביל ל-onError.getInputStream ומחזירים BitmapFactory.decodeStream(inputStream), שקורא את המידע בסטרים ומפרש אותו כ-bitmap.onAboutToBegin קוראים ל-imageView.setImageBitmap(null) כדי לנקות את התמונה הקודמת, ומציגים דיאלוג. ב-onSuccess מסירים את הדיאלוג וקוראים ל-setImageBitmap(downloadedBitmap). ב-onError מסירים את הדיאלוג ומציגים Toast.ImageDownloader עם this וקוראים ל-execute עם הקישור הקבוע בקוד. בהדגמה נבחר קישור ישיר לתמונת JPEG של חתול. צריך לוודא שיש הרשאת אינטרנט ב-manifest.הטקסט המלא של הדקות הראשונות בהרצאה «Download Image» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בסרטונים הקודמים ניגשנו דרך הטקסט דאונלודר שבנינו לאיזשהו API מרוחק והבנו מידע טקסטואלי. בסרטון הזה אנחנו הולכים לראות איך אנחנו יכולים לגשת ולהחזיר תמונה ולא מידע טקסטואלי.
אז אנחנו בעצם הולכים לגלוש לאיזשהו לינק מרוחק שיש בו תמונה, להוריד אותה באופן דינמי ולהציג אותה. אז במקום TextDownloader, אנחנו רוצים שיהיה לנו ImageDownloader.
אז בואו קודם כל נעשה איזשהו Renaming לשם TextDownloader, ונרשום ImageDownloader. בואו נעשה Refactor, ומה שעשינו זה רק שינינו את השם. אנחנו רוצים לקחת את הטקסט דאונלודר הזה, ופשוט לשנות אותו לכזה שיוכל להחזיר תמונה.
אז דבר ראשון, אנחנו כן רוצים לקבל string, כי אנחנו רוצים לקבל את ה-URL או את ה-Link שבו יושבת תמונה. אנחנו לא רוצים לדווח שום דבר כרגע בתהליך, כי אנחנו פשוט ניגשים, מורידים את התמונה, ואנחנו רוצים רק להחזיר אותה, ולכן במקום string כאן, אנחנו רוצים להגדיר bitmap.
אבל זה לא רק כאן שאנחנו צריכים להגדיר את ה-bitmap, כבר אנחנו רואים פה שגיעה, כי doingBackground עכשיו קיבלה הוראה להחזיר ביטמאפ. ובנוסף, אנחנו רוצים גם שה-onPostExecute תקבל אובייקט ביטמאפ, ובעצם הביטמאפ שהורדנו.
עכשיו אנחנו צריכים לטפל בזה גם כאן. לדוגמה, ב-onSuccess, אנחנו רוצים גם כן להוריד ביטמאפ, וזה יהיה downloaded ביטמאפ. בואו נרשום כאן downloaded bitmap.
במידע ויש שגיאה, אנחנו עדיין רוצים לדווח את ה-status code ואת ה-ero message, on about to begin, לא מדווחת שום דבר, אלא רק את העובדה שאנחנו הולכים להתחיל את התהליך.
את זה אנחנו גם צריכים לשנות, ל-downloaded bitmap. ויש לנו עכשיו את הקוד עצמו שאנחנו צריכים לשנות. אז בואו ניגש מלמעלה למטה ונראה מה הדברים הדרושים לשינוי בשביל להביא תמונה ולא טקסט.
אז המחלקה נקראת image downloader ואנחנו רוצים את ה-interface callbacks, status code, error message, זה בסדר. הקונסטרקטור מקבל איזשהו אובייקט שממש את ה-Listener, זה כנראה יהיה ה-main activity ומעדכן את המשתנה הגלובלי.
בפרה-Execute אנחנו רק אומרים שאנחנו הולכים להתחיל וכך מי שמאזין לנו יוכל פשוט להציג לדוגמה איזה שהוא דיאלוג כזה שהיוזר יראה שמשהו מתרחש. on ב-do in background קיבלנו את ה-string, ואנחנו כן רוצים http url connection, אבל אנחנו לא צריכים את שלושת אלה.
מה שאנחנו צריכים זה רק input stream, מפני שה-input stream reader וה-buffered reader נועדו בכדי שיהיה לנו יותר קל לקרוא שורות-שורות, read line, read line. אבל אנחנו לא קוראים פה מידע טקסטואלי ולכן אין לנו כאן שורות שורות, אז את זה אנחנו מוחקים.
כן, יש לנו try, יש לנו פה קבלה של ה-URL שנשלח אלינו מה-Activity, הוצאת ה-URL לאו-בי-אק-URL, התחברות לקישור המרוחק ל-URL על ידי Open Connection, ומה שאנחנו רוצים זה לקבל את הסטטוס קוד לראות מה בעצם מבחינת הסטטוס האם הכל בסדר וקיבלנו את התמונה או שיש איזושהי שגיאה אחרת אם הכל בסדר, בוא נתחיל כזה דבר
אם לא בסדר, אם אנחנו לא קיבלנו HTTP סטטוס אוקיי אז אנחנו רוצים להדכן את השגיאה getResponseMessage ולהחזיר null ואז שימו לב שהפונקציה onPostExecut תקבל null ותבדוק אם אנחנו null אז אנחנו מעלים את ה-onError אם אנחנו לא null הגיעה תמונה
חוקית ואנחנו שולחים את התמונה בואו נמשיך ואנחנו נמצאים פה אז inputStream מקבל את ה-inputStream ויש לנו ערוץ תקשורת ל-response שמוחזר מהלינק שגלשנו אליו וכל מה שאנחנו צריכים לעשות בשלב הזה אנחנו לא צריכים לבנות אובייקט input stream reader או buffered reader ולרוץ על ידי string builder
אנחנו לא עושים את כל אלה, כל מה שאנחנו עושים זה רק מחזירים bitmap factory ויש לנו decode stream שמקבל את ה-input stream ואם אנחנו נרחף מעליו, אנחנו נראה שהוא הופך את הסטרים לביטמפ פשוט קורא את הדאטה שיש בערוץ תקשורת הזה, בסטרים הזה ויודע שיש שם איזשהו ביטמפ, הופך את זה לביטמפ ואנחנו מחזירים את הביטמפ הזה מה יש לנו כאן?
אם יש אקספשן, שום בעיה נעדכן את האקספשן בארור מסג' ונחזיר נל סגירות, רק שני החבר'ה אלה צריכים להיסגר