-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Better error handling for image loading errors on iOS/Android #849
Conversation
@hartez do you mind rebase please. Thanks |
e9f74b2
to
d4f4ae9
Compare
{ | ||
protected override async void Init () | ||
{ | ||
int retry = 5; | ||
while (retry-- >= 0) { | ||
var imageUri = new Uri ("https://xamarin.com/content/images/pages/products/platform.png"); | ||
var imageUri = new Uri ("https://raw.githubusercontent.com/xamarin/Xamarin.Forms/master/Xamarin.Forms.ControlGallery.Android/Assets/WebImages/XamarinLogo.png"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
think this is failing the tests
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems to only happen when there's no cache of the image.
Consistent error logging and IsLoading on Android,iOS,UWP Move error logging into image handlers for better messages Add demo of custom ImageRenderer error handling Update docs Make the test smaller so the results don't get pushed offscreen Fix namespace error
2f9f3e5
to
a2089ca
Compare
Use local disposed member where possible for disposed check
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor comments that could or not be address.. not important stuff to block the pr
@@ -43,19 +46,20 @@ | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime> | |||
<AndroidLinkMode>Full</AndroidLinkMode> | |||
<AndroidLinkMode>None</AndroidLinkMode> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need this ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, better revert the linker, multidex, etc.
if (Device.IsInvokeRequired) | ||
throw new InvalidOperationException("Image Bitmap must not be updated from background thread"); | ||
|
||
if (previousImage != null && Equals(previousImage.Source, newImage.Source)) | ||
return; | ||
|
||
((IImageController)newImage).SetIsLoading(true); | ||
((IImageController)newImage)?.SetIsLoading(true); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we use as IImageController
since we are changing ?
catch (IOException ex) | ||
{ | ||
Internals.Log.Warning("Xamarin.Forms.Platform.Android.ImageRenderer", "Error updating bitmap: {0}", ex); | ||
((IImageController)newImage).SetIsLoading(false); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as above maybe :
( newImage as IImageController)?.SetIsLoading
|
||
if (_element != null) | ||
_element.PropertyChanged -= OnElementPropertyChanged; | ||
base.Dispose(disposing); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If order is important maybe leave a comment
|
||
protected async Task UpdateBitmap(Image previous = null) | ||
{ | ||
if (_element == null || _disposed) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i would drop the {
:)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Need to turn the linker back on, but looks good otherwise.
@@ -43,19 +46,20 @@ | |||
<ErrorReport>prompt</ErrorReport> | |||
<WarningLevel>4</WarningLevel> | |||
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime> | |||
<AndroidLinkMode>Full</AndroidLinkMode> | |||
<AndroidLinkMode>None</AndroidLinkMode> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, better revert the linker, multidex, etc.
{ | ||
// By default we'll just catch and log any exceptions thrown by UpdateBitmap so they don't bring down | ||
// the application; a custom renderer can override this method and handle exceptions from | ||
// UpdateBitmap differently if it wants to |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
* GH-23: Added Tizen backend (#555) * Adding the initial work to get Tizen started. #23 * Adding the initial work to get Tizen started. #23 * Use the overloads properly. * Use the overloads properly. * Tizen needs to have a background explicitly set * Added the Vibration API * Added the Vibration API * Refactoring a little bit * Refactoring a little bit * Added the Browser API and some basic permissions checking * Added the Browser API and some basic permissions checking * Added the Battery API * Added the Battery API * Added the Acceleromerter API * Added the Acceleromerter API * Added the Filesystem API * Added the Filesystem API * Update Accelerometer Initialize using GetDefaultSensor * Update Accelerometer Initialize using GetDefaultSensor * Added the Gyroscope API * Added the Gyroscope API * Added the Magnetometer API * Added the Magnetometer API * Added the Compass API * Added the Compass API * Added the Connectivity API * Added the Connectivity API * Added the Flashlight API * Added the Flashlight API * Added the SecureStorage API * Added the SecureStorage API * Added the Vibration API * Added the Vibration API * Fixed build break * Fixed build break * Added the OrientationSensor API * Fixed build break * Initialized Maps/Launcher for Tizen * Added the Permissions API * Added the Geolocation API * Added the Geocoding API * Fixed build break * Initialize Barometer API * Added the Barometer API * Added the TextToSpeech API * Added the Launcher APIs * Fixed bugs * Update Location property name * Update several modules - Update AppInfo, Browser, Clipboard, Compass, Connectivity, DisplayInfo, DeviceInfo, Geocoding, TextToSpeech modules - Change module name DataTrasfer to Share, Maps to Map - Integrated module Power to Battery, ScreenLock to DeviceDisplay * Throw PlatformNotSupportedException for Tizen * Change the exception for the power saver feature * Add tizen privileges * Add FileBase * Add ShareFileRequest * Change enum for Browser * Change parameter for Permissions * Add SensorSpeedExtensions * Add Launcher for OpenFileRequest * Fix .csproj for VS2019 * Fix sample for watch * Fix Geolocation speed * Fix TextToSpeech ptich * Fixed missing using System; This was needed for the Math calls * Add Support for ⌚OS and 📺OS (#827) * Add Support for watchOS and tvOS * Fix up exception from shared netstandard code to figure out what to send. * Update Battery.ios.watchos.cs * Integrate Tizen into the netstandard not supported area. * [Tizen] Fix reference for avoid duplication (#850) * Fix reference to avoid version collision * Remove Vector3 reference on Tizen * Fix iPad not show share sheet (#873) Need to specify bottom center of the screen. * Added the Main Thread helpers from Xamarin.Forms (#849) * Added Invoke methods from Xamarin.Forms * Updated to use Essentials approach to calling the MainThread * Updated the docs with the new MainThread methods * Make overload more readable The old code was I think incorrect in that the `funcTask()` was never awaited or returned as a task. This is the same code as the overload with the generic type parameter, but without the type param. * Updated to use UrlEncode in GetMailToUrl (#848) * Updated to use UrlEncode in GetMailToUrl Fixes #843 * Added missing using * Fixed Using order and spacings * Use WebUtility.UrlEncode on placemark extensions * Added volatile to MainThread.Android (#877) Fixes #838 * Add Launcher.TryOpenAsync (#839) * Add Launcher.TryOpenAsync * Added ConfigureAwait(false) * Removed unnecessary async * Updated launcher docs * Updated the docs * Added Launch Tests * Add aka.ms for release notes (#883) * Remove experimental flags & fix launcher teasts (#887)
* GH-23: Added Tizen backend (#555) * Adding the initial work to get Tizen started. #23 * Adding the initial work to get Tizen started. #23 * Use the overloads properly. * Use the overloads properly. * Tizen needs to have a background explicitly set * Added the Vibration API * Added the Vibration API * Refactoring a little bit * Refactoring a little bit * Added the Browser API and some basic permissions checking * Added the Browser API and some basic permissions checking * Added the Battery API * Added the Battery API * Added the Acceleromerter API * Added the Acceleromerter API * Added the Filesystem API * Added the Filesystem API * Update Accelerometer Initialize using GetDefaultSensor * Update Accelerometer Initialize using GetDefaultSensor * Added the Gyroscope API * Added the Gyroscope API * Added the Magnetometer API * Added the Magnetometer API * Added the Compass API * Added the Compass API * Added the Connectivity API * Added the Connectivity API * Added the Flashlight API * Added the Flashlight API * Added the SecureStorage API * Added the SecureStorage API * Added the Vibration API * Added the Vibration API * Fixed build break * Fixed build break * Added the OrientationSensor API * Fixed build break * Initialized Maps/Launcher for Tizen * Added the Permissions API * Added the Geolocation API * Added the Geocoding API * Fixed build break * Initialize Barometer API * Added the Barometer API * Added the TextToSpeech API * Added the Launcher APIs * Fixed bugs * Update Location property name * Update several modules - Update AppInfo, Browser, Clipboard, Compass, Connectivity, DisplayInfo, DeviceInfo, Geocoding, TextToSpeech modules - Change module name DataTrasfer to Share, Maps to Map - Integrated module Power to Battery, ScreenLock to DeviceDisplay * Throw PlatformNotSupportedException for Tizen * Change the exception for the power saver feature * Add tizen privileges * Add FileBase * Add ShareFileRequest * Change enum for Browser * Change parameter for Permissions * Add SensorSpeedExtensions * Add Launcher for OpenFileRequest * Fix .csproj for VS2019 * Fix sample for watch * Fix Geolocation speed * Fix TextToSpeech ptich * Fixed missing using System; This was needed for the Math calls * Add Support for ⌚OS and 📺OS (#827) * Add Support for watchOS and tvOS * Fix up exception from shared netstandard code to figure out what to send. * Update Battery.ios.watchos.cs * Integrate Tizen into the netstandard not supported area. * [Tizen] Fix reference for avoid duplication (#850) * Fix reference to avoid version collision * Remove Vector3 reference on Tizen * Fix iPad not show share sheet (#873) Need to specify bottom center of the screen. * Added the Main Thread helpers from Xamarin.Forms (#849) * Added Invoke methods from Xamarin.Forms * Updated to use Essentials approach to calling the MainThread * Updated the docs with the new MainThread methods * Make overload more readable The old code was I think incorrect in that the `funcTask()` was never awaited or returned as a task. This is the same code as the overload with the generic type parameter, but without the type param. * Updated to use UrlEncode in GetMailToUrl (#848) * Updated to use UrlEncode in GetMailToUrl Fixes #843 * Added missing using * Fixed Using order and spacings * Use WebUtility.UrlEncode on placemark extensions * Added volatile to MainThread.Android (#877) Fixes #838 * Add Launcher.TryOpenAsync (#839) * Add Launcher.TryOpenAsync * Added ConfigureAwait(false) * Removed unnecessary async * Updated launcher docs * Updated the docs * Added Launch Tests * Add aka.ms for release notes (#883) * Remove experimental flags & fix launcher teasts (#887)
Description of Change
async void
image loading methods and crashing the applicationIImageSourceHandler
implementations andImageRenderer
classesImageRenderer
subclasses to use an alternative error handling methodImage.IsLoading
when image loading errors occur so it's not left atIsLoading == true
forever.Image.IsLoading
and error logging when image loading errors occurBugs Fixed
API Changes
ToString
implementations onFileImageSource
andUriImageSource
to be more informative.Behavioral Changes
Log
class when an image cannot be loaded have changed to be slightly more specific.PR Checklist