C# windows phone 8.1中JSON反序列化的速度
我正在为WindowsPhone8.1开发应用程序,并使用RESTAPI和JSON与数据库通信。这一切都可以正常工作,但我在反序列化JSON和将数据加载到ListView的速度方面遇到了问题。当我加载小数据(大约20-30项)时,应用程序运行得很流畅,但如果有超过100项,我甚至要等待4-5秒才能加载到ListView。有人知道解决这个问题的有效方法吗?:)这是反序列化问题还是加载到ListView的问题 这里是反序列化的SCC# windows phone 8.1中JSON反序列化的速度,c#,json,listview,windows-phone-8.1,deserialization,C#,Json,Listview,Windows Phone 8.1,Deserialization,我正在为WindowsPhone8.1开发应用程序,并使用RESTAPI和JSON与数据库通信。这一切都可以正常工作,但我在反序列化JSON和将数据加载到ListView的速度方面遇到了问题。当我加载小数据(大约20-30项)时,应用程序运行得很流畅,但如果有超过100项,我甚至要等待4-5秒才能加载到ListView。有人知道解决这个问题的有效方法吗?:)这是反序列化问题还是加载到ListView的问题 这里是反序列化的SC List<dataInfo> VypisZakaz
List<dataInfo> VypisZakazekli = new List<dataInfo>();
private async void DeserializeData(string json)
{
//MessageDialog msg = new MessageDialog(json);
//await msg.ShowAsync();
this.ListBox1.ItemsSource = null;
CultureInfo culture = new CultureInfo("cs-CZ");
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<dataInfo>));
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
var obj = (List<dataInfo>)ser.ReadObject(stream);
VypisZakazekli.Clear();
foreach (dataInfo di in obj)
{
string barva = "";
string iZakazka = di.zakazka;
string sNazev = di.nazev;
string sKod = di.kod_firmy;
string sStatus = "Status: " + di.status_v;
string sDruh = di.druh_zakazky;
switch(di.barva)
{
case "ZE": barva = "#FF32FF1D"; break;
case "CE": barva = "#FFFF1D1D"; break;
case "ZL": barva = "#FFF5FF1D"; break;
case "OR": barva = "#FFFFA31D"; break;
case "MO": barva = "#FF1D46FF"; break;
default: barva="x:Null"; break;
}
VypisZakazekli.Add(new dataInfo(iZakazka, sNazev, sKod, sStatus, sDruh,barva));
}
this.ListBox1.ItemsSource = VypisZakazekli;
}
这里是XAML列表视图
<ListView SelectionMode="None" x:Name="ListBox1" Margin="0,0,-0.167,0.167"
HorizontalAlignment="Stretch" IsItemClickEnabled="True"
ContinuumNavigationTransitionInfo.ExitElementContainer="True"ItemsSource="{Binding}" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Background="#FF464242" Margin="0,0,0,10" Tapped="Grid_Tapped">
<!--<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem Text="Detail zakázky" Click="Detail" />
</MenuFlyout>
</FlyoutBase.AttachedFlyout>-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Margin="0,0,0,0" HorizontalAlignment="Left">
<Rectangle Width="20" VerticalAlignment="Stretch" Fill="{Binding barva}" />
</Border>
<StackPanel Grid.Column="1" Margin="5,0,10,10" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding nazev}" Foreground="White" FontSize="21" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding zakazka}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Foreground="#FFFFEC31" />
<TextBlock Text="{Binding kod_firmy}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Margin="20,0,0,0" />
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
一些加速
- 使用Json.Net反序列化(不确定是否适用于Windows 8.1)
- 不要请求所有数据,而是一次异步请求20个项目。这对最终用户来说似乎要快得多
- 使用Json.Net反序列化(不确定是否适用于Windows 8.1)
- 不要请求所有数据,而是一次异步请求20个项目。这对最终用户来说似乎要快得多
反序列化数据
标记为异步
?你不会等待里面的任何东西。如果您认为用async
标记方法会使其异步,那么async
就不是这样工作的
JSON反序列化不是问题所在。您正在同时向
列表视图提供所有项目,这并不理想。创建一个可观察集合
,并将其绑定到列表视图
。然后,您可以将您的项目逐个添加到此集合中,而不使列表视图停止。首先,为什么方法反序列化数据
标记为异步
?你不会等待里面的任何东西。如果您认为用async
标记方法会使其异步,那么async
就不是这样工作的
JSON反序列化不是问题所在。您正在同时向列表视图提供所有项目,这并不理想。创建一个可观察集合
,并将其绑定到列表视图
。然后,您可以将您的项目逐个添加到此集合中,而不会使列表视图停止。这些都不是问题,尽管我同意应该使用Json.Net。如果一次添加20个项目,UI线程仍将努力创建UI项目,使应用程序的响应性稍微提高,但仍然无法使用。UI虚拟化是真正释放UI线程并使应用程序响应的唯一方法。@skleanthu,我说是异步的,所以应用程序不会等待UI线程。这有时称为无限滚动
,已使用多年。如果异步添加项目,数据将异步添加到集合中,并在后台线程中,但是UI线程仍然必须在视图中实例化UI项,以显示集合中的新数据。这些都不是问题,尽管我同意应该使用Json.Net。如果一次添加20个项目,UI线程仍将努力创建UI项目,使应用程序的响应性稍微提高,但仍然无法使用。UI虚拟化是真正释放UI线程并使应用程序响应的唯一方法。@skleanthu,我说是异步的,所以应用程序不会等待UI线程。这有时称为无限滚动
,已使用多年。如果异步添加项目,数据将异步添加到集合中,并在后台线程中,但是UI线程仍然必须在视图中实例化UI项,以显示集合中的新数据。您可以发布示例吗?我试图创建ObservableCollection,但它与List相同。如何逐个添加项目?使用绑定是很重要的,将集合绑定到您的列表视图的itemsource
属性。您的问题是this.ListBox1.ItemsSource=VypisZakazekli
(顺便说一句),它一次将所有数据发送到列表视图
。看看MVVM,这段代码背后是一个灾难,你能举个例子吗?我试图创建ObservableCollection,但它与List相同。如何逐个添加项目?使用绑定是很重要的,将集合绑定到您的列表视图的itemsource
属性。您的问题是this.ListBox1.ItemsSource=VypisZakazekli
(顺便说一句),它一次将所有数据发送到列表视图
。看看MVVM,这段代码背后是一场灾难
<ListView SelectionMode="None" x:Name="ListBox1" Margin="0,0,-0.167,0.167"
HorizontalAlignment="Stretch" IsItemClickEnabled="True"
ContinuumNavigationTransitionInfo.ExitElementContainer="True"ItemsSource="{Binding}" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Background="#FF464242" Margin="0,0,0,10" Tapped="Grid_Tapped">
<!--<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem Text="Detail zakázky" Click="Detail" />
</MenuFlyout>
</FlyoutBase.AttachedFlyout>-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" Margin="0,0,0,0" HorizontalAlignment="Left">
<Rectangle Width="20" VerticalAlignment="Stretch" Fill="{Binding barva}" />
</Border>
<StackPanel Grid.Column="1" Margin="5,0,10,10" >
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding nazev}" Foreground="White" FontSize="21" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding zakazka}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Foreground="#FFFFEC31" />
<TextBlock Text="{Binding kod_firmy}" Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Margin="20,0,0,0" />
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>