// TODO hartez 2017/04/07 09:33:03 Review this again, not sure it's handling the transition from previousImage to 'null' newImage correctly static async Task UpdateBitmap( this AImageView imageView, IImageElement newView, IImageElement previousView, ImageSource newImageSource, ImageSource previousImageSource) { IImageController imageController = newView as IImageController; newImageSource = newView?.Source; previousImageSource = previousView?.Source; if (newImageSource == null || imageView.IsDisposed()) { return; } if (Equals(previousImageSource, newImageSource)) { return; } imageController?.SetIsLoading(true); (imageView as IImageRendererController)?.SkipInvalidate(); imageView.SetImageResource(global::Android.Resource.Color.Transparent); bool setByImageViewHandler = false; Bitmap bitmap = null; try { if (newImageSource != null) { var imageViewHandler = Internals.Registrar.Registered.GetHandlerForObject <IImageViewHandler>(newImageSource); if (imageViewHandler != null) { await imageViewHandler.LoadImageAsync(newImageSource, imageView); setByImageViewHandler = true; } else { var imageSourceHandler = Internals.Registrar.Registered.GetHandlerForObject <IImageSourceHandler>(newImageSource); bitmap = await imageSourceHandler.LoadImageAsync(newImageSource, imageView.Context); } } } catch (TaskCanceledException) { imageController?.SetIsLoading(false); } // Check if the source on the new image has changed since the image was loaded if (!Equals(newView?.Source, newImageSource)) { bitmap?.Dispose(); return; } if (!setByImageViewHandler && !imageView.IsDisposed()) { if (bitmap == null && newImageSource is FileImageSource) { imageView.SetImageResource(ResourceManager.GetDrawableByName(((FileImageSource)newImageSource).File)); } else { imageView.SetImageBitmap(bitmap); } } bitmap?.Dispose(); imageController?.SetIsLoading(false); }