Я разрабатываю приложение для 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>
Ни одна из них не является проблемой, хотя я согласен, что Json.Net следует использовать. Если вы добавите по 20 элементов за раз, все равно поток пользовательского интерфейса будет бороться за создание элементов пользовательского интерфейса, что делает приложение незначительно более отзывчивым, но все еще непригодным для использования. Виртуализация пользовательского интерфейса - единственный способ избавиться от потока пользовательского интерфейса и сделать приложение отзывчивым. – SKleanthous
@SKleanthous, я сказал асинхронно, поэтому приложение не ждет в потоке пользовательского интерфейса. Это иногда называют бесконечной прокруткой и используется уже много лет. –
Если вы добавите элементы асинхронно, данные будут добавлены в сборку асинхронно и в фоновом потоке, но в потоке пользовательского интерфейса все равно придется создавать экземпляры пользовательского интерфейса в представлении, которое покажет новые данные в коллекции. – SKleanthous