2017-03-01 95 views
0

我有一个Xamarin Android应用程序,我从Web服务获取数据,然后将其绑定到列表视图。Xamarin.Android:异步任务抛出未处理的异常

在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(); 
} 

唯一的问题我得到的是,它在unhanled异常的消息说An unhandled exception occured.结束后,消息出现的OnStart已经解雇后没有任何迹象表明,以什么问题可能是。

回答

1

我不确定是什么原因导致您的异常,因为此消息非常差。但是我发现了一个应该修复的问题,它可能足以让您的代码运行。在OnStart()您使用的方法.Wait();。这可能会导致死锁,并会阻止您的用户界面。阅读更多关于here。此外,我认为你不需要存储你的任务。您可以在OnStart()等待。

因此,我建议你以下OnStart();

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

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

而且它的约定,所有异步方法命名与异步的结束。也许这可以帮助你。如果这不能解决您的问题,请尝试找出内部异常。只需调试您的Exception并选择属性“InnerException”即可查看它。

+0

感谢您的回答。事情是,我创建的应用程序是在线和离线工作。所以它会检查连通性并基于该异步方法被触发。出于这个原因,我不想让我的OnStart作为异步。如果我确实使它异步,它也会以同样的方式离线执行吗? – progrAmmar

+0

@progrAmmar是的,这是没有问题的。您也可以使其脱机同步。异步只是通知编译器,本身不做任何事情。只要你的方法没有等待,它会执行同步,没有任何东西会运行异步。等待使该方法异步。因此,如果您的等待状态处于正常状态,您可以轻松地运行异步标记的同步方法。 – Sebi