web-dev-qa-db-fra.com

UIImage chargé à partir de l'URL dans Xamarin / C #

Cela fait 4 ans que cette question a été répondu par ce billet de blog .

Existe-t-il un moyen standard de créer un UIImage avec une image à partir d'une URL? Quelque chose comme:

UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");

J'ai l'impression de manquer quelque chose de vraiment simple.

26
Jason Hartley

Pas un liner, mais avec très peu de lignes, vous pouvez rouler le vôtre. Par exemple.

static UIImage FromUrl (string uri)
{
    using (var url = new NSUrl (uri))
    using (var data = NSData.FromUrl (url))
        return UIImage.LoadFromData (data);
}

Les appels, y compris celui de UIImage, sont thread-safe.

56
poupou

Avec le nouveau support wait/async, vous pouvez faire:

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));
        }

et vous appelez cela avec:

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url");
27
Pavel Sich

Vous voulez être sûr de charger l'image asynchrone afin de ne pas bloquer votre thread d'interface utilisateur. MonoTouch.Dialog inclut une classe ImageLoader (voir sec 5.3) que vous pourriez utiliser.

Il existe également quelques variantes de rlImageStore pour aider au chargement asynchrone des images.

Enfin, si vous voulez le faire manuellement, il existe une Xamarin Recipe que vous pouvez utiliser.

5
Jason

J'ai essayé ce qui précède, cela ressemble à une excellente idée, mais j'obtiens: Impossible de convertir implicitement le type System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' toMonotouch.UIKit.UIImage '

[a trouvé une solution] Le problème était que le
obj.Image = attendez cela.LoadImage (imageUrl) doit également être dans une méthode marquée async. Alors ça marche!

Merci

1
Scott Emick

Le code ci-dessous devrait fonctionner,

public static async Task<UIImage> LoadImage(string imageUrl)
{
            var httpClient = new HttpClient();

            var contents = await httpClient.GetByteArrayAsync(imageUrl);
            return UIImage.LoadFromData(NSData.FromArray(contents));
}
0
Anisetti Nagendra