Xamarin TabView切换时调用Async/Await Web API避免界面卡顿方案问询
核心问题根因
- 代码中调用了
responseTask.Wait()与responseTask.Result两个同步阻塞方法,会直接占用UI线程直到HTTP请求完成,是界面卡顿的核心诱因。 loadOtherData错误声明为async void,不符合普通异步方法的编写规范,异常处理难度更高。- 每次请求都新建
HttpClient实例,会产生不必要的性能开销,长期运行还可能导致套接字资源耗尽。
优化后实现代码
首先修改数据加载方法:
// 全局复用HttpClient,避免频繁创建销毁的性能开销和套接字浪费 private static readonly HttpClient _httpClient = new HttpClient() { BaseAddress = new Uri("https://xxxx.somee.com/api/GetTaskByStatus/") }; // 普通异步方法返回Task,不要使用async void public async Task LoadOtherData(string grp) { try { // 直接await异步请求,不会阻塞UI线程 var res = await _httpClient.GetAsync(grp); if (res.IsSuccessStatusCode) { string readTask = await res.Content.ReadAsStringAsync(); var data = JsonConvert.DeserializeObject<ObservableCollection<api>>(readTask); Items1 = new ObservableCollection<api>(data); // 确保UI绑定操作在主线程调度,避免跨线程访问UI报错 Device.BeginInvokeOnMainThread(() => { AcceptList.ItemsSource = Items1; }); } } catch (Exception ex) { // 此处可添加异常捕获逻辑,比如请求失败的提示弹窗 } }
再修改Tab点击事件逻辑,事件处理器可合法使用async void:
private async void AssignedTab_TabTapped(object sender, TabTappedEventArgs e) { // 可选:切换Tab时先清空列表、展示加载占位符,提升用户感知 AcceptList.ItemsSource = null; await LoadOtherData("Assigned"); } private async void PendingTab_TabTapped(object sender, TabTappedEventArgs e) { AcceptList.ItemsSource = null; await LoadOtherData("Pending"); }
额外优化建议
- 可在加载数据期间展示加载动画占位,避免用户误以为界面无响应
- 已加载过的Tab数据可做本地缓存,重复切换同个Tab时无需重复发起请求,进一步降低等待时间
- 若列表项数量较多,可开启列表控件的UI虚拟化配置,减少数据绑定时的渲染开销
内容的提问来源于stack exchange,提问作者Anikwenwa Tosan
相关产品推荐
相关产品推荐

