You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:48:11