Xamarin调用ASP.NET Core API触发空引用异常崩溃排查
问题根因与修复方案
你遇到的API交互触发崩溃问题由多个明确问题导致,按影响优先级排序:
1. 核心空引用崩溃原因:MonkeyCache未初始化
你在InternetCoffeeService中直接调用Barrel.Current做本地缓存,但MonkeyCache.FileStore要求必须在应用启动阶段完成初始化,未初始化时Barrel.Current为null,只要访问其成员就会抛出NullReferenceException,这是下拉刷新触发GET请求时直接崩溃的根因,和你看到的JNI层未处理空引用报错完全匹配。
修复方法
在Xamarin.Forms共享项目的App.xaml.cs构造函数中,InitializeComponent();调用后添加初始化代码:
using MonkeyCache.FileStore; Barrel.Current.ApplicationId = "MyCoffeeAppCache";
2. ViewModel删除命令的调用错误
你在InternetCoffeeViewModel的Remove方法中,错误给静态非泛型类InternetCoffeeService添加了泛型参数,触发删除操作时会直接抛出运行时错误:
// 错误写法 await InternetCoffeeService<Coffee>.RemoveCoffee(coffee.Id);
修复方法
替换为正确的静态类调用方式:
await InternetCoffeeService.RemoveCoffee(coffee.Id);
3. WebAPI项目配置错误
你贴出的Program.cs内容完全复制了Startup.cs的代码,不是ASP.NET Core WebAPI的正确实现,会导致Web服务无法正常启动,模拟器访问接口时会抛出连接失败异常。
修复方法
替换Program.cs为正确的主机构建代码(以.NET 5为例):
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; namespace MyCoffeeApp.WebAPI { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { // 监听所有网卡IP,确保安卓模拟器可通过10.0.2.2转发访问 webBuilder.UseUrls("http://0.0.0.0:5000"); webBuilder.UseStartup<Startup>(); }); } }
本地调试阶段可以暂时注释掉Startup.cs里生产环境的app.UseHttpsRedirection();配置,避免HTTP请求被强制跳转拦截。
4. 其他潜在崩溃点修复
- 安卓项目添加网络权限:在
AndroidManifest.xml的<manifest>节点下添加<uses-permission android:name="android.permission.INTERNET" /> - 给Refresh方法的接口返回值加空判断,避免请求异常时AddRange传入null触发二次崩溃:
var coffees = await InternetCoffeeService.GetCoffee(); if(coffees != null) Coffee.AddRange(coffees); - Add方法中对弹窗返回值做非空判断,用户点击取消弹窗时直接返回,不要提交空参数请求。
内容的提问来源于stack exchange,提问作者user13610173
相关产品推荐
相关产品推荐

