[英]Speed of JSON deserilization in windows phone 8.1
我正在为 Windows Phone 8.1 开发应用程序,我正在使用 REST API 和 JSON 与数据库进行通信。 一切正常,但我在速度反序列化 JSON 并将数据加载到 ListView 时遇到问题。 当我加载小数据(大约 20-30 个项目)时,应用程序很流畅,但如果有 100 个以上的项目,我什至要等待 4-5 秒才能加载到 ListView。 有谁知道解决它的有效方法? :) 这是反序列化的问题还是加载到 ListView 的问题?
这是反序列化的SC
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;
}
这是 DataInfo 类
[DataContract]
class dataInfo
{
[DataMember]
public string zakazka { get; set; }
[DataMember]
public string nazev { get; set; }
[DataMember]
public string kod_firmy { get; set; }
[DataMember]
public string status_v { get; set; }
[DataMember]
public string druh_zakazky { get; set; }
[DataMember]
public string barva { get; set; }
public dataInfo(string Zakazka, string Nazev, string Kod, string Status, string Druh, string Barva)
{
this.zakazka = Zakazka;
this.nazev = Nazev;
this.kod_firmy = Kod;
this.status_v = Status;
this.druh_zakazky = Druh;
this.barva = Barva;
}
}
这是 XAML ListVIew
<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个项目。 对于最终用户来说,这将显得更快。
首先,为什么将DeserializeData
方法标记为async
? 您不await
任何东西。 如果您认为使用async
标记方法会使它异步,那不是async
工作原理。
JSON反序列化不是问题。 您正在一次给ListView
所有项目,这是不理想的。 创建一个ObservableCollection
并将其绑定到ListView
。 然后,您可以将项目逐个添加到此集合中,而不会导致ListView
停止。
您需要做的是虚拟化UI和数据。 当前,您的视图难以同时显示所有项目。 从UI虚拟化开始,考虑到创建20-30个项目就可以了。
发生的情况是,您的视图当前正在努力创建所有100个视图项并将其添加到LitView。 随着项目数量的增加,这只会变得更糟。 如果使用虚拟化,则UI项将被回收。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.