Intereting Posts
Установите цвет фона LinearLayout с помощью логического значения Android для цикла и задержки не синхронный Регулярное выражение для удаления всех непечатаемых символов Servlet: java.lang.ClassNotFoundException: org.json.simple.parser.ParseException Исключение Android TextView и null указателя Установка маржи и гравитации текста в коде не работает Изменение позиции просмотра после окончания анимации Ошибка Запуск AVD – «Не удалось открыть файл: (null) /system/build.prop: Нет такого файла или каталога» Заполнение не работает на некоторых устройствах Spotify Intent в android? Создание жестких ссылок и Symlinks в Android Добавление локальных файлов .aar в мою структуру градиента Получение «Неизвестного приложения ABI» при попытке отладки кода C в приложении для Android Как удалить встроенную поддержку проекта Android в eclipse, потому что eclipse показывает ошибки в jni? Извлечение большого количества данных, каков наилучший способ?

Android: загрузка изображения из Интернета с помощью Asynctask

Как заменить следующие строки кода на Asynctask? Как вы «возвращаете» битмап из Asynctask? Спасибо.

ImageView mChart = (ImageView) findViewById(R.id.Chart); String URL = "http://www...anything ..."; mChart.setImageBitmap(download_Image(URL)); public static Bitmap download_Image(String url) { //--------------------------------------------------- Bitmap bm = null; try { URL aURL = new URL(url); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { Log.e("Hub","Error getting the image from server : " + e.getMessage().toString()); } return bm; //--------------------------------------------------- } 

Я подумал о чем-то вроде этого:

Заменить:

 mChart.setImageBitmap(download_Image(graph_URL)); 

Что-то вроде:

 mChart.setImageBitmap(new DownloadImagesTask().execute(graph_URL)); 

а также

 public class DownloadImagesTask extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... urls) { return download_Image(urls[0]); } @Override protected void onPostExecute(Bitmap result) { mChart.setImageBitmap(result); // how do I pass a reference to mChart here ? } private Bitmap download_Image(String url) { //--------------------------------------------------- Bitmap bm = null; try { URL aURL = new URL(url); URLConnection conn = aURL.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); bis.close(); is.close(); } catch (IOException e) { Log.e("Hub","Error getting the image from server : " + e.getMessage().toString()); } return bm; //--------------------------------------------------- } } 

Но как передать ссылку на mChart в onPostExecute (результат Bitmap) ??? Мне нужно каким-то образом передать его URL? Я хотел бы заменить все мои строки кода:

 mChart1.setImageBitmap(download_Image(URL_1)); mChart2.setImageBitmap(download_Image(URL_2)); 

С чем-то похожим … но в Asynctask образом!

 mChart1.setImageBitmap(new DownloadImagesTask().execute(graph_URL_1)); mChart2.setImageBitmap(new DownloadImagesTask().execute(graph_URL_2)); 

Есть ли простое решение для этого? Я здесь что-то не так?

Solutions Collecting From Web of "Android: загрузка изображения из Интернета с помощью Asynctask"

Если нет веских оснований для загрузки изображения самостоятельно, я бы рекомендовал использовать Picasso .

Picasso сохраняет все проблемы с загрузкой, настройкой и кэшированием изображений. Весь код, необходимый для простого примера:

 Picasso.with(context).load(url).into(imageView); 

Если вы действительно хотите сделать все сами, используйте мой более старый ответ ниже.


Если изображение не так велико, вы можете просто использовать анонимный класс для задачи async. Это было бы так:

 ImageView mChart = (ImageView) findViewById(R.id.imageview); String URL = "http://www...anything ..."; mChart.setTag(URL); new DownloadImageTask.execute(mChart); 

Класс Task:

 public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> { ImageView imageView = null; @Override protected Bitmap doInBackground(ImageView... imageViews) { this.imageView = imageViews[0]; return download_Image((String)imageView.getTag()); } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); } private Bitmap download_Image(String url) { ... } 

Скрытие URL-адреса в теге немного сложно, но в вызывающем классе оно выглядит лучше, если у вас много изображений, которые вы хотите заполнить таким образом. Это также помогает, если вы используете ImageView внутри ListView и хотите узнать, был ли ImageView переработан во время загрузки изображения.

Я написал, если изображение не так велико, потому что это приведет к тому, что задача будет иметь неявный указатель на основное действие, заставляющее сборщик мусора удерживать всю активность в памяти до завершения задачи. Если пользователь переходит на другой экран вашего приложения, а загрузка растровой памяти не может быть освобождена, это может привести к замедлению вашего приложения и всей системы.

Попробуйте этот код:

 ImageView myFirstImage = (ImageView) findViewById(R.id.myFirstImage); ImageView mySecondImage = (ImageView) findViewById(R.id.mySecondImage); ImageView myThirdImage = (ImageView) findViewById(R.id.myThirdImage); String URL1 = "http://www.google.com/logos/2013/estonia_independence_day_2013-1057005.3-hp.jpg"; String URL2 = "http://www.google.com/logos/2013/park_su-geuns_birthday-1055005-hp.jpg"; String URL3 = "http://www.google.com/logos/2013/anne_cath_vestlys_93rd_birthday-1035005-hp.jpg"; myFirstImage.setTag(URL1); mySecondImage.setTag(URL2); myThirdImage.setTag(URL3); new DownloadImageTask.execute(myFirstImage); new DownloadImageTask.execute(mySecondImage); new DownloadImageTask.execute(myThirdImage); public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> { ImageView imageView = null; @Override protected Bitmap doInBackground(ImageView... imageViews) { this.imageView = imageViews[0]; return download_Image((String)imageView.getTag()); } @Override protected void onPostExecute(Bitmap result) { imageView.setImageBitmap(result); } private Bitmap download_Image(String url) { Bitmap bmp =null; try{ URL ulrn = new URL(url); HttpURLConnection con = (HttpURLConnection)ulrn.openConnection(); InputStream is = con.getInputStream(); bmp = BitmapFactory.decodeStream(is); if (null != bmp) return bmp; }catch(Exception e){} return bmp; } } 

Вы можете создать класс say..BkgProcess, который содержит внутренний класс, который расширяет AsyncTask. А экземпляр BkgProcess передает контекст вашего класса Activity в конструкторе BkgProcess. Например:

 public class BkgProcess { String path; Context _context; public Download(Downloader downloader, String path2){ this.path = path2; _context = downloader; } public void callProgressDialog(){ new BkgProcess().execute((Void)null); } class Downloads extends AsyncTask<Void, Void, Boolean> { private ProgressDialog dialog = new ProgressDialog(_context); protected void onPreExecute(){ dialog.setMessage("Downloading image.."); dialog.show(); } protected void onPostExecute(Boolean success) { dialog.dismiss(); if(success) Toast.makeText(_context, "Download complete", Toast.LENGTH_SHORT).show(); } @Override protected Boolean doInBackground(Void... params) { return(startDownload(path)); } public boolean startDownload(String img_url) { // download img.. return true; } } } 

Из вашего класса активности ..

 BkgProcess dwn = new BkgProcess (Your_Activity_class.this, img_path); dwn.callProgressDialog(); 

Это даст вам изображения любого размера … если вы не хотите, чтобы диалог прогресса просто комментировал коды в onPreExecute ();

 for(int i = 0 ; i < no_of_files ; i++ ) new FetchFilesTask().execute(image_url[i]); private class FetchFilesTask extends AsyncTask<String, Void, Bitmap> { private ProgressDialog dialog = new ProgressDialog(FileExplorer.this); Bitmap bitmap[]; protected void onPreExecute(){ dialog.setMessage("fetching image from the server"); dialog.show(); } protected Bitmap doInBackground(String... args) { bitmap = getBitmapImageFromServer(); return bitmap; } protected void onPostExecute(Bitmap m_bitmap) { dialog.dismiss(); if(m_bitmap != null) //store the images in an array or do something else with all the images. } } public Bitmap getBitmapImageFromServer(){ // fetch image form the url using the URL and URLConnection class }