void UpdateBitmap(CachedImageView imageView, CachedImage image, CachedImage previousImage) { lock (_updateBitmapLock) { CancelIfNeeded(); if (image == null || imageView == null || imageView.Handle == IntPtr.Zero || _isDisposed) { return; } var ffSource = ImageSourceBinding.GetImageSourceBinding(image.Source, image); if (ffSource == null) { if (_lastImageSource == null) { return; } _lastImageSource = null; imageView.SetImageResource(global::Android.Resource.Color.Transparent); return; } if (previousImage != null && !ffSource.Equals(_lastImageSource)) { _lastImageSource = null; imageView.SkipInvalidate(); Control.SetImageResource(global::Android.Resource.Color.Transparent); } image.SetIsLoading(true); var placeholderSource = ImageSourceBinding.GetImageSourceBinding(image.LoadingPlaceholder, image); var errorPlaceholderSource = ImageSourceBinding.GetImageSourceBinding(image.ErrorPlaceholder, image); TaskParameter imageLoader; image.SetupOnBeforeImageLoading(out imageLoader, ffSource, placeholderSource, errorPlaceholderSource); if (imageLoader != null) { var finishAction = imageLoader.OnFinish; var sucessAction = imageLoader.OnSuccess; imageLoader.Finish((work) => { finishAction?.Invoke(work); ImageLoadingFinished(image); }); imageLoader.Success((imageInformation, loadingResult) => { sucessAction?.Invoke(imageInformation, loadingResult); _lastImageSource = ffSource; }); if (!_isDisposed) { _currentTask = imageLoader.Into(imageView); } } } }