2016-06-19 3 views
2

У меня есть ListView из нескольких элементов, и каждый элемент в списке должен иметь связанное с ним изображение. Я создал адаптер массива, чтобы удерживать каждый элемент списка и иметь URL-адрес изображения, которое я хочу загрузить.Асинхронно загружать изображение из URL в ImageView в Xamarin Android

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

Вот метод я использую, чтобы попытаться загрузить изображение

private async Task<Bitmap> GetImageBitmapFromUrl(string url, ImageView imageView) 
{ 
    Bitmap imageBitmap = null; 

    try 
    { 
     var uri = new Uri(url); 
     var response = httpClient.GetAsync(uri).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var imageBytes = await response.Content.ReadAsByteArrayAsync(); 
      if (imageBytes != null && imageBytes.Length > 0) 
      { 
       imageBitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length); 
       imageView.SetImageBitmap(imageBitmap); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e); 
    } 

    return imageBitmap; 
} 

Я инициализацию моего HttpClient так:

httpClient = new HttpClient(); 
httpClient.Timeout = new TimeSpan(0, 0, 10); 
httpClient.MaxResponseContentBufferSize = 256000; 

А вот как я называю GetImageFromUrl методом

ImageView myImage = convertView.FindViewById<ImageView>(Resource.Id.AsyncImageView) 
myImage.SetImageBitmap(null); 
string url = GetItem(position); 
GetImageBitmapFromUrl(url, myImage); 

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

ответ

6

Вам не нужно заботиться о загрузке изображений.

Существует две хорошие библиотеки для загрузки изображения в ImageView async в Xamarin.Android.

Picasso component (source) использование:

Picasso.With(context) 
     .Load("http://i.imgur.com/DvpvklR.png") 
     .Into(imageView); 

FFImageLoading (source) использование:

ImageService.Instance.LoadUrl(urlToImage).Into(_imageView); 

Примечание (из документации):

В отличие от Пикассо вы не можете использовать FFImageLoading со стандартом ImageViews. Вместо этого просто загрузите изображения в экземпляры ImageViewAsync. Обновление вашего кода очень просто, так как ImageViewAsync наследует от ImageView.

+1

Я пошел с решением Пикассо. Спасибо за быстрый ответ! –

+0

nuget is square.picasso – smedasn

Смежные вопросы