Xamarin.Forms安卓端MVVM调用REST API加载ListView报空引用异常
问题根因
抛出NullReferenceException的直接原因是_rest字段为null:你在ViewModel里通过DependencyService.Get<IMachineService>()获取服务实例,但当前出问题的项目没有完成IMachineService和实现类MachineService的依赖注册,所以DependencyService返回了null,后续执行await _rest.GetMachines()时就触发了空引用错误。
相同代码在其他项目能正常运行,本质是其他项目里已经做了对应依赖注册,当前项目遗漏了这一步配置。
日志里输出的程序集加载失败、硬件加速相关内容都是Xamarin Android调试的常规输出,和本次空引用无关。
修复方法
- 第一步:给
MachineService添加Xamarin依赖注册特性,保证DependencyService能扫描到实现类。在MachineService所在的文件顶部,命名空间声明外添加如下代码:
[assembly: Xamarin.Forms.Dependency(typeof(MachineService))]
添加后服务类的结构参考如下:
using Xamarin.Forms; // 注册特性放在命名空间外 [assembly: Dependency(typeof(MachineService))] namespace YourAppNamespace.Services { public class MachineService : IMachineService { public string Base_url = "https://169.254.178.79:45455/api/"; public async Task<ObservableCollection<Machine>> GetMachines() { string url = Base_url + "machines"; HttpClient client = new HttpClient(); HttpResponseMessage responseMessage = await client.GetAsync(url); if (responseMessage.StatusCode == System.Net.HttpStatusCode.OK) { var result = await responseMessage.Content.ReadAsStringAsync(); var json = JsonConvert.DeserializeObject<ObservableCollection<Machine>>(result); return json; } return null; } } }
- 额外检查项:
- 确认Android项目清单文件
AndroidManifest.xml中已经声明INTERNET权限,否则本地HTTPS接口请求会失败(该问题不会触发本次空引用,但注册完依赖后如果接口不通可以排查这一项) - 建议不要每次调用接口都新建
HttpClient实例,全局复用一个静态实例可以避免套接字耗尽问题,属于后续可优化的点 - 尽量避免在构造函数里直接调用
async void方法,可以把数据加载逻辑移到页面的OnAppearing生命周期方法中调用,方便异常捕获。
- 确认Android项目清单文件
内容的提问来源于stack exchange,提问作者Gazdallah Amira
相关产品推荐
相关产品推荐

