xamarin - 如何在同步函数中调用异步函数?
问题描述
我希望来自异步函数的数据作为一个列表返回,该列表将在同步函数内分配一个列表。我在 xamarin android 的 Fragment 的 OnCreateView 方法中调用异步函数,它返回一个列表。当异步方法去获取数据时,它进入等待模式。当它等待数据返回时,它会退出函数并阅读下面调用它的同步方法的代码行。当异步函数无法返回列表时。它导致我的活动列表为空并且不显示任何数据。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OSDAMobileModel;
using System.Net.Http;
using Newtonsoft.Json;
using System.Threading.Tasks;
using System.Collections;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace OSDAMobileApp
{
public class CheckInFragment : Fragment
{
List<Route> lstRoute = new List<Route>();
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate(Resource.Layout.SelectRoute, container, false);
ListView routesListView = view.FindViewById<ListView>(Resource.Id.ListView);
List<Route> routeslst = lstRoute;
OnAppearing();
routesListView.Adapter = new CustomListAdapter(lstRoute);
return view;
}
protected async Task<List<Route>> OnAppearing()
//protected List<Route> OnAppearing()
{
SetupFiles setupFiles = new SetupFiles();
//PRPMaster prpMaster = new PRPMaster();
var prpDetails = await setupFiles.LoadTextAsync("PRPDetails.txt");
PRPMaster prpMaster = JsonConvert.DeserializeObject<PRPMaster>(prpDetails);
foreach (var item in prpMaster.PRPDetails)
{
lstRoute.Add(item.Route);
}
return lstRoute;
}
}
}
解决方案
我建议您async
直接在函数中修改列表,然后通过调用将更改通知适配器:
RunOnUiThread(() => routesListView.Adapter.NotifyDataSetChanged());
顺便说一句,你OnAppearing
称之为Task.Run(() => OnAppearing());
所以它最终会像:
ListView routesListView;
List<Route> lstRoute = new List<Route>();
...
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var view = inflater.Inflate(Resource.Layout.SelectRoute, container, false);
routesListView = view.FindViewById<ListView>(Resource.Id.ListView);
routesListView.Adapter = new CustomListAdapter(lstRoute);
Task.Run(() => OnAppearing());
return view;
}
...
protected async Task OnAppearing()
{
SetupFiles setupFiles = new SetupFiles();
//PRPMaster prpMaster = new PRPMaster();
var prpDetails = await setupFiles.LoadTextAsync("PRPDetails.txt");
PRPMaster prpMaster = JsonConvert.DeserializeObject<PRPMaster>(prpDetails);
foreach (var item in prpMaster.PRPDetails)
{
lstRoute.Add(item.Route);
}
// This is necessary for the adapter to update its data
RunOnUiThread(() => routesListView.Adapter.NotifyDataSetChanged());
}
HIH
推荐阅读
- python - 在 pandas/python 中有效地解析时间格式
- c# - 将来自 Xam.Plugin.Media 5.0.1 的 imageSource 转换为 Xamarinforms 中的字节数组?
- python - 使用列表匹配包含整个单词的正则表达式
- servlets - 如何避免Java request.getQueryString() 得到转义字符串
- java - Kerberos cannot use ticket cache in Java code
- list - Groovy:使用 groupBy 求和 - 列表列表
- java - 用于从设备孪生获取所需属性的 Azure IoT 中心设备与服务 SDK?
- r - R Highcharter Errorbar 系列位置闪避
- apache - 重写规则以根据给定的获取参数更改多个获取参数
- amazon-web-services - AWS Elastic Beanstalk - Java 平台和 Tomcat 平台有什么区别?