我有一个Xamarin Android应用程序,我从Web服务获取数据,然后将其绑定到列表视图。
MainActivity.cs中的方法如下:
private async Task LoadDataFromService()
{
int userId = int.Parse(applicationData[USER_ID]); // Shared prefrenced data
//ASYNC Method getting data from JSON and converting it into Sales Object
Task<IList<Sales>> apiDataTask = UserData.GetSales(userId);
IList<Sales> apiData = await apiDataTask;
if (apiData != null)
{
salesList = apiData as List<Sales>;
dbManager.Update(salesList); //Sync with SQLite DB
}
}
在我的MainActivity
中,我定义了一个全局变量,为该任务提供了一个标识符
public class MainActivity : Activity
{
private Task loadData;
}
我称之为:
public class MainActivity : Activity
{
private Task loadData;
protected override void OnCreate(Bundle bundle)
{
loadData = new Task(async () => { await LoadDataFromService(); });
}
}
然后我必须等到数据下载后再将数据放入ListView
。
protected override void OnStart()
{
base.OnStart();
loadData.Start(); // This is causing to generate an exception
loadData.ContinueWith(t => { BindData(); }).Wait();
}
我得到的唯一问题是它以一个未填充的异常结束消息An unhandled exception occured.
,消息在OnStart被触发后发出,并且没有迹象表明问题可能是什么。
答案 0 :(得分:1)
我不确定是什么原因引起了您的异常,因为此消息非常糟糕。但是我发现了一个你应该修复的问题,这可能足以让你的代码运行。在OnStart()
方法中,您正在使用.Wait();
。这可能会导致死锁并阻止您的UI。详细了解here。此外,我认为您不需要存储您的任务。您可以在OnStart()
中等待它。
所以我建议您关注OnStart();
:
protected override async void OnStart()
{
base.OnStart();
var data = await LoadDataFromService();
BindingData();
}
此外,所有异步方法都以Async命名为结尾。也许这可以帮到你。如果这不能解决您的问题,请尝试找出内部异常。只需调试Exception并选择Property“InnerException”即可查看。