Если нет веских причин для самостоятельной загрузки изображения, я бы рекомендовал использовать Picasso .
Picasso избавит вас от всех проблем с загрузкой, настройкой и кэшированием изображений.
Весь код, необходимый для простого примера:
Picasso.with(context).load(url).into(imageView);
Если вы действительно хотите все сделать сами, используйте мой старый ответ ниже.
Если изображение не такое большое, вы можете просто использовать анонимный класс для асинхронной задачи.
Это было бы так:
ImageView mChart = (ImageView) findViewById(R.id.imageview);
String URL = "http://www...anything ...";
mChart.setTag(URL);
new DownloadImageTask.execute(mChart);
Класс задачи:
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 переработан во время загрузки изображения.
Я написал, если ваш образ не такой большой, потому что это приведет к тому, что у задачи будет неявный указатель на основное действие, в результате чего сборщик мусора сохранит все действие в памяти, пока задача не будет завершена. Если пользователь переходит на другой экран вашего приложения во время загрузки растрового изображения, память не может быть освобождена, и это может замедлить работу вашего приложения и всей системы.