Xamarin Forms,使用async来应用ListView ItemSource

时间:2015-05-09 08:58:39

标签: c# listview asynchronous xamarin.forms

我目前正在使用Xamarin Forms,我使用的是从{github RESTAPI获得的post方法。每当我尝试将数据应用到ListView ItemsSource时,我的应用程序就会崩溃。

以下是当前执行的成功回调,它检索JSON并将其序列化并将其存储在名为listData的列表中。

public class Home : ContentPage
{
    private ListView myListView;
    private List<Person> listInfo = new List<Person> { };

    RESTAPI rest = new RESTAPI();
    Uri address = new Uri("http://localhost:6222/testBackEnd.aspx");

    public Home ()
    {
        Dictionary<String, String> data = new Dictionary<String, String>();
        rest.post(address, data, success, null);

        Content = new StackLayout { 
            Children = 
            {
                myListView
            }
        };
    }

    public void success(Stream stream)
    {
        DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(List<Person>));
        listData = (List<Person>)sr.ReadObject(stream);
        //myListView.ItemsSource = listData;
    }
}

是因为它不是异步的,如果是这样,我怎么能让这个方法异步?我之前在Windows Phone 8.1上使用以下等待代码做了一个,是否有可用的Xamarin Forms等效版本?

async public void success(Stream stream)
{
    DataContractJsonSerializer sr = new DataContractJsonSerializer(typeof(List<Person>));
    listData = (List<Person>)sr.ReadObject(stream);
    await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        myListView.ItemsSource = listData;
    });
}

2 个答案:

答案 0 :(得分:4)

您可以尝试这种方式:

      Task.Run(()=> {
            downloadAllInformation();
             Device.BeginInvokeOnMainThread( ()=> {
                myListView.ItemSource = ... 
             });

         });

以这种方式异步管理listView的填充。

我用大量数据尝试了这一点,表现更好。

答案 1 :(得分:3)

如果是因为它是异步的,那么你应该在主线程中进行UI更改(总是)。 为此:

using Xamarin.Forms;
...
    Device.BeginInvokeOnMainThread(()=>{
        // do the UI change
    }

如果这不能解决问题,那么异步不是(唯一的?)问题。