我有一个包含多个项目的ListView,列表中的每个项目都应该有一个与之关联的图像。我创建了一个数组适配器来保存每个列表项并拥有我想要加载的图像的URL。
我正在尝试使用Web请求异步加载图像并让它设置图像并在加载后在视图中更新它,但视图应立即使用默认图像进行渲染。
以下是我用来尝试加载图片的方法
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);
使用此代码时,请求最终会返回错误的请求,但是当我查看我正在使用的URL并将其粘贴到浏览器窗口时,它会显示我期待的图像。
答案 0 :(得分:10)
您无需关心下载图片。
有两个好的库可以将图片加载到ImageView
中的Xamarin.Android
异步中。
Picasso.With(context)
.Load("http://i.imgur.com/DvpvklR.png")
.Into(imageView);
FFImageLoading(source)用法:
ImageService.Instance.LoadUrl(urlToImage).Into(_imageView);
注意(来自文档):
与Picasso不同,您不能将FFImageLoading与标准ImageView一起使用。 而只需将图像加载到ImageViewAsync实例中。 由于ImageViewAsync继承,因此更新代码非常简单 ImageView的。