迁移Xamarin至.NET MAUI后二次启动因FFImageLoading.Compat崩溃
迁移Xamarin到.NET MAUI后二次启动因FFImageLoading.Compat崩溃的问题解决
问题详情
- 应用从Xamarin迁移至.NET MAUI后,首次启动运行正常,但关闭后再次启动时抛出异常
- 当前依赖
FFImageLoading.Compat.Maui(版本3.0.0.0) - 安卓端异常触发于
MainActivity.cs的base.OnCreate(_Bundle)方法;iOS端在AppDelegate.cs处崩溃 - 异常栈追踪指向
FFImageLoading.Maui.CachedImage.SetupOnBeforeImageLoading方法,具体栈信息如下:
at FFImageLoading.Maui.CachedImage.SetupOnBeforeImageLoading(TaskParameter& imageLoader, IImageSourceBinding source, IImageSourceBinding loadingPlaceholderSource, IImageSourceBinding errorPlaceholderSource) at FFImageLoading.Maui.Platform.CachedImageHandler.UpdateBitmap(CachedImageView imageView, CachedImage image, CachedImage previousImage) at FFImageLoading.Maui.Platform.CachedImageHandler.ConnectHandler(CachedImageView platformView) at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].OnConnectHandler(View platformView) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 76 at Microsoft.Maui.Handlers.ViewHandler.OnConnectHandler(Object platformView) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandler.cs:line 151 at Microsoft.Maui.Handlers.ElementHandler.ConnectHandler(Object platformView) in D:\a\_work\1\s\src\Core\src\Handlers\Element\ElementHandler.cs:line 106 at Microsoft.Maui.Handlers.ElementHandler.SetVirtualView(IElement view) in D:\a\_work\1\s\src\Core\src\Handlers\Element\ElementHandler.cs:line 64 at Microsoft.Maui.Handlers.ViewHandler.SetVirtualView(IElement element) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandler.cs:line 134 at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].SetVirtualView(IView view) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 53 at Microsoft.Maui.Handlers.ViewHandler`2[[FFImageLoading.Maui.CachedImage, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null],[FFImageLoading.Maui.Platform.CachedImageView, FFImageLoading.Compat.Maui, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null]].SetVirtualView(IElement view) in D:\a\_work\1\s\src\Core\src\Handlers\View\ViewHandlerOfT.cs:line 56 at Microsoft.Maui.Controls.Element.SetHandler(IElementHandler newHandler) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\Element\Element.Impl.cs:line 69 at Microsoft.Maui.Controls.Element.set_Handler(IElementHandler value) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\Element\Element.Impl.cs:line 19 at Microsoft.Maui.Controls.VisualElement.Microsoft.Maui.IElement.set_Handler(IElementHandler value) in D:\a\_work\1\s\src\Controls\src\Core\HandlerImpl\VisualElement\VisualElement.Impl.cs:line 305 at Microsoft.Maui.Platform.ElementExtensions.ToHandler(IElement view, IMauiContext context) in D:\a\_work\1\s\src\Core\src\Platform\ElementExtensions.cs:line 96
解决方案
1. 清理应用退出时的FFImageLoading缓存
在App.xaml.cs的OnSleep或OnStop方法中添加缓存清理逻辑,避免二次启动时缓存残留导致异常:
protected override void OnSleep() { base.OnSleep(); // 清理所有类型缓存 FFImageLoading.ImageService.Instance.InvalidateCacheAsync(FFImageLoading.Cache.CacheType.All).Wait(); FFImageLoading.ImageService.Instance.ClearMemoryCache(); FFImageLoading.ImageService.Instance.ClearDiskCacheAsync().Wait(); }
2. 修正FFImageLoading服务初始化配置
在MauiProgram.cs中确保服务正确注册并替换MAUI默认图像处理器:
var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); }); // 注册FFImageLoading服务 builder.Services.AddFFImageLoading(options => { options.DiskCacheDuration = TimeSpan.FromDays(7); options.MemoryCacheSize = 1024 * 1024 * 50; // 50MB内存缓存 }); // 替换原生Image控件的Handler为FFImageLoading实现 builder.ConfigureMauiHandlers(handlers => { handlers.AddHandler<Microsoft.Maui.Controls.Image, FFImageLoading.Maui.Platform.CachedImageHandler>(); }); return builder.Build();
3. 检查并修复CachedImage绑定
确保XAML中CachedImage的Source绑定存在 fallback 处理,避免空值触发异常:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:ffimageloading="clr-namespace:FFImageLoading.Maui;assembly=FFImageLoading.Compat.Maui" x:Class="YourApp.Views.YourPage"> <ffimageloading:CachedImage Source="{Binding ItemImageUrl, FallbackValue='default_placeholder.png'}" LoadingPlaceholder="loading_placeholder.png" ErrorPlaceholder="error_placeholder.png" HeightRequest="150" WidthRequest="150" /> </ContentPage>
4. 升级FFImageLoading.Compat.Maui版本
当前使用的3.0.0.0版本存在已知的二次启动缓存问题,通过NuGet包管理器升级到最新兼容版本,可修复部分底层bug。
5. 替换为MAUI原生Image控件(备选方案)
若上述方法无效,可逐步替换CachedImage为MAUI原生Image控件,配合MAUI自带的图像缓存机制:
// 在MauiProgram.cs中配置原生图像缓存 builder.Services.Configure<Microsoft.Maui.Platform.ImageLoaderConfiguration>(options => { options.CacheDuration = TimeSpan.FromDays(7); options.MaxCacheSize = 1024 * 1024 * 50; });
内容的提问来源于stack exchange,提问作者saif
相关产品推荐
相关产品推荐

