2015-09-25 2 views
1

Я разрабатываю приложение для Windows Phone 8.1, и я использую REST API и JSON для связи с базой данных. Все работает, но у меня проблема с десериализацией скорости JSON и загрузкой данных в ListView. Когда я загружаю небольшие данные (около 20-30 пунктов), использование свободно, но если есть более 100 элементов, я жду даже 4-5 секунд для загрузки в ListView. Кто-нибудь знает эффективный способ его решения? :) Это проблема десериализации или проблемы загрузки в ListView?Скорость десерилизации JSON в телефоне Windows 8.1

Вот НЦ десериализации

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 Class

[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> 

ответ

0

Несколько скорость взлетов

  • Использование Json.Net для deserialise (Не уверен, если работает на ОС Windows 8.1)

  • Вместо запроса все данные, попросите 20 пунктов в то время асинхронно. Это будет казаться, что он будет работать быстрее.

+0

Ни одна из них не является проблемой, хотя я согласен, что Json.Net следует использовать. Если вы добавите по 20 элементов за раз, все равно поток пользовательского интерфейса будет бороться за создание элементов пользовательского интерфейса, что делает приложение незначительно более отзывчивым, но все еще непригодным для использования. Виртуализация пользовательского интерфейса - единственный способ избавиться от потока пользовательского интерфейса и сделать приложение отзывчивым. – SKleanthous

+0

@SKleanthous, я сказал асинхронно, поэтому приложение не ждет в потоке пользовательского интерфейса. Это иногда называют бесконечной прокруткой и используется уже много лет. –

+0

Если вы добавите элементы асинхронно, данные будут добавлены в сборку асинхронно и в фоновом потоке, но в потоке пользовательского интерфейса все равно придется создавать экземпляры пользовательского интерфейса в представлении, которое покажет новые данные в коллекции. – SKleanthous

-1

Что вам нужно сделать, это виртуализировать свой пользовательский интерфейс и данные. В настоящее время ваше мнение изо всех сил пытается показать все предметы одновременно. Начните с виртуализации пользовательского интерфейса, что должно быть достаточно, если вы создадите 20-30 элементов.

Что происходит, так это то, что ваш взгляд в настоящее время изо всех сил пытается создать все 100 элементов вида и добавить их в LitView. Это будет только ухудшаться с увеличением количества предметов. Если вы используете виртуализацию, элементы пользовательского интерфейса будут переработаны.

См: http://www.zagstudio.com/blog/497#.VgUm-_lViko

0

Во-первых, почему метод DeserializeData отмечен как async? Вы ничего не делаете await. Если вы считаете, что маркировка метода с async делает его асинхронным, это не так, как работает async.

JSON десериализация не является проблемой. Вы даете ListView все предметы сразу, что не идеально. Создайте ObservableCollection и привяжите его к ListView. Затем вы можете добавить свои предметы в эту коллекцию по одному, не делая ListView halt.

+0

Не могли бы вы разместить пример? Я попытался создать ObservableCollection, но это то же самое, что и List. Как я могу добавлять элементы по одному? – Matey

+0

Использование привязки - важная вещь, привяжите коллекцию к свойству 'ItemsSource' вашего' ListView'. Ваша проблема: 'this.ListBox1.ItemsSource = VypisZakazekli;' (ужасное чешское название btw.), Которое сразу отправляет все данные в «ListView». Взгляните на MVVM, этот код - это катастрофа –

Смежные вопросы