繁体   English   中英

windows phone 8.1中JSON反序列化的速度

[英]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项将被回收。

参见: http : //www.zagstudio.com/blog/497#.VgUm-_lViko

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM