MAUI中CollectionView加载远程图片Android崩溃但Windows正常
Android模拟器加载远程图片崩溃:连接失败异常排查与解决
问题描述
开发的MAUI页面通过ObservableCollection加载远程图片,该功能在Windows平台运行正常,但在Android模拟器中崩溃。使用Visual Studio 17.11.3,曾了解到VS 17.3版本存在类似问题且已修复,已确认图片URI均正确。经排查,错误由获取数据的C#代码抛出:
System.Net.Http.HttpRequestException: 'Connection failure'
相关调用栈:
0x11 in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw C# 0x3E in System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess C# 0x2E in System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification C# 0xA in System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd C# 0x7 in System.Runtime.CompilerServices.TaskAwaiter<System.Net.Http.HttpResponseMessage>.GetResult C# > 0x37A in Library.LibraryService.GetRecommmendedReads at C:\Users\richa\source\repos\LibraryAppM\Class1.cs:374,25 C# 0x11 in System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Collections.Generic.List<Library.Recommended>>.AsyncStateMachineBox<Library.LibraryService.<GetRecommmendedReads>d__61>.ExecutionContextCallback C# 0x42 in System.Threading.ExecutionContext.RunInternal C# 0x47 in System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Collections.Generic.List<Library.Recommended>>.AsyncStateMachineBox<Library.LibraryService.<GetRecommmendedReads>d__61>.MoveNext C# 0x2 in System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.Collections.Generic.List<Library.Recommended>>.AsyncStateMachineBox<Library.LibraryService.<GetRecommmendedReads>d__61>.MoveNext C# 0x6 in System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.<>c.<.cctor>b__8_0 C# 0xC in Android.App.SyncContext. at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.App/SyncContext.cs:36,19 C# 0xE in Java.Lang.Thread.RunnableImplementor.Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Java.Lang/Thread.cs:37,6 C# 0x8 in Java.Lang.IRunnableInvoker.n_Run at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net8.0/android-34/mcw/Java.Lang.IRunnable.cs:84,4 C# 0x8 in Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PP_V at /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:22,5 C#
相关XAML代码:
<CollectionView Grid.Row="4" ItemsSource="{Binding RecommendedList}" VerticalOptions="FillAndExpand"> <CollectionView.ItemsLayout> <GridItemsLayout HorizontalItemSpacing="5" Orientation="Vertical" Span="1" VerticalItemSpacing="5" /> </CollectionView.ItemsLayout> <CollectionView.ItemTemplate> <DataTemplate> <Grid Padding="10,0,10,0" ColumnDefinitions="1*,10,Auto" RowDefinitions="Auto" RowSpacing="5"> <Image Grid.Column="0" Aspect="Center"> <Image.Source> <UriImageSource Uri="{Binding ImgUrl}" /> </Image.Source> </Image> <Label Grid.Column="2" HorizontalOptions="StartAndExpand" Text="{Binding Title}" /> </Grid> </DataTemplate> </CollectionView.ItemTemplate>
排查与解决办法
1. 验证Android网络权限
确保Android项目的AndroidManifest.xml中已添加互联网权限:
<uses-permission android:name="android.permission.INTERNET" />
如果目标API级别≥28(Android 9+)且请求的是HTTP明文链接,需配置网络安全配置:
- 在
Resources/xml下创建network_security_config.xml:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config> - 在
AndroidManifest.xml的<application>标签中引用:android:networkSecurityConfig="@xml/network_security_config"
优先建议改用HTTPS链接,避免明文流量限制。
2. 检查模拟器网络连通性
- 打开模拟器内置浏览器,直接访问图片URL或API接口,确认是否能正常加载
- 切换模拟器网络模式:在模拟器设置中选择“桥接模式”,或重置模拟器的网络设置
- 如果访问的是本地主机API,将
localhost替换为10.0.2.2(Android模拟器默认将该地址映射到主机的localhost)
3. 优化HttpClient配置
- 检查
HttpClient初始化逻辑,确保设置合理的超时时间:var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; - 若遇到SSL证书验证问题(仅测试环境使用),可添加自定义Handler忽略验证:
生产环境请勿使用此方式,需确保证书合法。var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true }; var httpClient = new HttpClient(handler);
4. 更新MAUI与相关依赖
确认项目使用的MAUI版本为最新稳定版,Visual Studio版本与MAUI版本可能存在版本差异,更新MAUI可修复潜在的网络相关bug:
- 在NuGet包管理器中更新
Microsoft.Maui.Controls、Microsoft.Maui.Controls.Compatibility等核心包
5. 捕获详细异常信息
在GetRecommmendedReads方法中添加异常日志,获取InnerException以定位具体失败原因:
try { // 你的API请求逻辑 } catch (HttpRequestException ex) { // 输出InnerException到日志或调试窗口 System.Diagnostics.Debug.WriteLine($"连接失败详情: {ex.InnerException?.Message}"); throw; }
关于已知问题的确认
你提到的旧版本问题已在后续版本中修复,当前VS 17.11.3对应的MAUI版本(通常为.NET 8稳定版)不存在该已知问题,大概率是网络配置或模拟器环境导致的连接失败,而非框架本身的bug。
内容的提问来源于stack exchange,提问作者user3017691
相关产品推荐
相关产品推荐

