Intereting Posts
Переупорядочение записи LRUCache при использовании get Запустить приложение JavaFX с внешними библиотеками в Android? Совет по партнерским программам для музыки для Android-приложений Добавление «emma» в триггеры сборки ant Antoid «исключение локального переменного типа» исключение Java.lang.RuntimeException: Невозможно создать экземпляр приложения: ClassNotFoundException (только на устройстве архитектуры X86) Навигация Ящик полупрозрачный поверх строки состояния не работает Установка Android SDK и AVD Manager Жизненный цикл Android View Bluetooth не работает в Android x86 на VirtualBox Неровность сосудов! Исправьте свои зависимости для FacebookSDK Как сериализовать использование gson с аннотацией @SerializedName? Заголовок Просмотр высоты в ListView Android studio – отсутствует каталог инструментов SDK " Разница между каталогами / res и / assets Как я могу редактировать текстовые файлы в папке с ресурсами в android

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 }