Xamarin.Android:Async Task抛出未处理的异常

时间:2017-03-01 06:53:10

标签: c# android visual-studio-2015 xamarin.android async-await

我有一个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被触发后发出,并且没有迹象表明问题可能是什么。

1 个答案:

答案 0 :(得分:1)

我不确定是什么原因引起了您的异常,因为此消息非常糟糕。但是我发现了一个你应该修复的问题,这可能足以让你的代码运行。在OnStart()方法中,您正在使用.Wait();。这可能会导致死锁并阻止您的UI。详细了解here。此外,我认为您不需要存储您的任务。您可以在OnStart()中等待它。

所以我建议您关注OnStart();

protected override async void OnStart()
{
     base.OnStart();

     var data = await LoadDataFromService();
     BindingData();    
 }

此外,所有异步方法都以Async命名为结尾。也许这可以帮到你。如果这不能解决您的问题,请尝试找出内部异常。只需调试Exception并选择Property“InnerException”即可查看。