2017-03-29 8 views
1

In Xamarin Forms i die folgenden Listenansicht haben:Xamarin Forms Listenansicht aus Speicherfehler

<ListView x:Name="StudentView" RowHeight="55" SeparatorVisibility="None" CachingStrategy="RecycleElement"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="55"></RowDefinition> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 

        <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="0" Aspect="AspectFill"></Image> 
        <Image Source="{Binding Image}" Grid.Row="0" Grid.Column="1" Aspect="AspectFill"></Image> 
       </Grid> 
      </ViewCell> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

Im Code hinter i ein Array von 1000 Elemente erklärt.

Das Problem ist, dass, wenn ich die Listview auf und ab scrollen, jedes Mal sehe ich im Xamarin Profil, dass die Speichernutzung erhöhen und scheint, dass CachingStrategy = "RecycleElement" nicht richtig funktioniert (getestet auf echten Android-Gerät).

Nach ein paar Mal scrollt das Programm mit nicht genügend Arbeitsspeicher.

Was ist das Problem? Wie kann ich es lösen?

Antwort

0

Nicht sicher, wie Sie die ItemSource der Listenansicht einstellen oder was sie ist. Es wäre nützlich, auch etwas Code-Behind-Datei dafür zu zeigen.

Als blinde Vermutung kann es zu Leistungsproblemen beim Recycling kommen, wenn Ihre Quelle nicht indexierbar ist. Die Empfehlung von Xamarin ist die Verwendung einer IList für die Itemsource, die Verwendung von etwas wie IEnumerable führt zu Leistungsproblemen für ein großes Array, da es im Grunde die Daten durchlaufen muss, um das richtige Element zur Anzeige zu finden.

0

1000 Bildgegenstände sind sehr viel! Ich wette, das ist Android, ich schlage vor, verschiedene Lösungen wie zu verwenden:

1.- Pagging-Strategien (Last 10, die Last weitere 10 und so). 2.- Reduzieren Sie die Bildgrößen. 3.- Verwenden Sie ein cachefähiges Bild wie: https://github.com/luberda-molinet/FFImageLoading 4.- Implementieren Sie einen benutzerdefinierten Renderer Ansicht mit einer Recycler-Ansicht.

Und dann wird das Thema größer und größer, wie Sie Ihre Listview-Leistung verbessern können, sind hier einige nützliche Links:

-https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/performance/

-https://blog.xamarin.com/creating-highly-performant-smooth-scrolling-android-listviews/

- https://blog.xamarin.com/tips-for-creating-a-smooth-and-fluid-android-ui/

- http://kent-boogaart.com/blog/jason-smith's-xamarin-forms-performance-tips

0

Ich hatte das gleiche Problem , große Liste von Bildern oder Bildern mit großer Auflösung verursacht dieses Problem, löste ich dies mit FFImageLoading gefunden here, auch verfügbar unter nuget, auch versuchen, Thumbnails anstelle des eigentlichen Bildes zu binden, wenn möglich.

<ContentPage xmlns:ci="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms"> 
<ci:CachedImage Source="{Binding ActualImageThumbnail}" Aspect="Fill"/> 
+0

Funktioniert auch, wenn das Bild anders ist? Zum Beispiel habe ich 1000 verschiedene Bilder und ich nehme an, dass die FFImageLoading-Bibliothek alle Bilder zwischenspeichert. Ich habe das Problem, dass während des Scrollens nach oben und unten und umgekehrt der Speicher erhöht und nicht gleich bleibt (mit recycle richtlinien in listview) – Tom

+0

ja es wird funktionieren, ich hatte eine Listenansicht mit einer großen Anzahl von einzigartigen Bildern (aber weniger als 200), beim Hoch- und Runterscrollen verursachte es eine "outOfMemory" -Ausnahme. Darüber hinaus würde ich nicht empfehlen, ein 1000-Item in eine Listenansicht zu laden, besonders in ein mobiles Gerät, das die App-Leistung senken würde. Ich werde mit einer Paging-Statergy gehen und Thumbnails verwenden, um den Speicherverbrauch zu reduzieren –