【问题标题】:Xamarin Forms, using async to apply ListView ItemSourceXamarin Forms,使用异步应用 ListView ItemSsource
【发布时间】:2015-05-09 08:58:38
【问题描述】:

我目前正在使用 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;
    });
}

【问题讨论】:

    标签: c# listview asynchronous xamarin.forms


    【解决方案1】:

    你可以试试这个方法:

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

    通过这种方式,您可以异步管理 listView 的填充。

    我已经用大量数据尝试过,性能更好。

    【讨论】:

      【解决方案2】:

      如果是因为它是异步的,那么您应该(始终)在主线程中进行 UI 更改。 这样做:

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

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

      【讨论】:

      • 我很高兴听到这个消息。
      • 干得好,伙计!
      • 我在更新绑定集合后遇到了我的项目被复制的问题,我是在后台线程中进行的。这解决了这个问题。
      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 2019-09-15
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多