如何处理异步&等待默认覆盖' s

时间:2015-05-26 13:53:09

标签: c# android asynchronous xamarin async-await

在Xamarin项目中,Android - 我是Android开发的新手。在处理活动时,在OnCreate方法中为ListView设置自定义适配器。

protected async override void OnCreate (Bundle bundle)
{
    base.OnCreate (bundle);
    SetContentView(Resource.Layout.Main);

    var listAdapter = new CustomListAdapter(this);
    //.................................................
    listView = (ListView) FindViewById(Resource.Id.list);

    // populate the listview with data
    listView.Adapter = listAdapter;
}

在适配器的ctor中,在异步调用中创建项目列表。

public CustomListAdapter(Activity context) //We need a context to inflate our row view from
    : base()
{
    this.context = context;
    // items is List<Product>
    items = await GetProductList();
}

由于Getproducts是异步调用,因此它将异步加载数据。

问题是,一旦我将适配器设置为列表,它将尝试调用适配器的GetView方法。那时,不会加载项目。所以有一个空例外。

如何处理这种情况。

感谢。

2 个答案:

答案 0 :(得分:5)

您无法在构造函数中使用await

你可以做几件事。这里最好的IMO是一个单独的异步方法,您可以在创建对象后调用并等待。

var listAdapter = new CustomListAdapter(this);
await listAdapter.InitializeAsync();

另一种选择是使构造函数成为私有的,并有一个异步静态方法来创建实例并初始化它:

public static async Task<CustomListAdapter> CustomListAdapter.CreateAsync(Activity context)
{
    var listAdapter = new CustomListAdapter(context);
    listAdapter.items = await GetProductList();
    return listAdapter;
}

答案 1 :(得分:-1)

也许覆盖getCount,所以如果items仍为null或items为零项,则返回listView大小应为0。

public int getCount() {
    return items != null ? items.size() : 0;
}