从Xamarin/C#中的URL加载的UIImage
本文关键字:加载 UIImage URL 中的 Xamarin | 更新日期: 2023-09-27 18:24:48
这篇博文已经4年没有回答这个问题了。
有没有一种标准的方法可以用URL中的图像创建UIImage?类似于:
UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");
我觉得我可能错过了一些非常简单的东西。
不是一行,但只有很少的几行,你就可以自己滚动。例如
static UIImage FromUrl (string uri)
{
using (var url = new NSUrl (uri))
using (var data = NSData.FromUrl (url))
return UIImage.LoadFromData (data);
}
这些调用(包括来自UIImage
的调用)是线程安全的。
有了新的等待/异步支持,您可以做到:
public async Task<UIImage> LoadImage (string imageUrl)
{
var httpClient = new HttpClient();
Task<byte[]> contentsTask = httpClient.GetByteArrayAsync (imageUrl);
// await! control returns to the caller and the task continues to run on another thread
var contents = await contentsTask;
// load from bytes
return UIImage.LoadFromData (NSData.FromArray (contents));
}
你用来称呼这个
someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url");
您需要确保以异步方式加载图像,这样就不会阻塞UI线程。Dialog包含一个可以使用的ImageLoader(参见第5.3节)类。
UrlImageStore还有一些变体可以帮助异步加载图像。
最后,如果你想手动操作,可以使用Xamarin配方。
我尝试了上面的方法,这看起来是个好主意,但我得到了:无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to
Monotouch.UIKet.UIImage'
[找到了解决方案]问题是因为
obj.Image=等待。LoadImage(imageUrl)还必须在标记为async的方法中。那就行了!
感谢
下面的代码应该可以工作,
public static async Task<UIImage> LoadImage(string imageUrl)
{
var httpClient = new HttpClient();
var contents = await httpClient.GetByteArrayAsync(imageUrl);
return UIImage.LoadFromData(NSData.FromArray(contents));
}