2016-06-05 16 views
2

Meine App muss das gleiche Bild eine bestimmte Anzahl von Malen laden. Daher muss ich die Speicherbelegung verwalten, da nach ein paar Iterationen der Speicher knapp wird. Ich versuche Garbage Collector zu verwenden, aber es funktioniert nicht. Ich mache das auf meiner Content-Seite.Nicht genügend Speicher beim Laden von Bildern auf Xamarin.Forms

Mein Code sieht so aus:

private async Task ExecuteTests(string imageResource) 
{ 

    // Do stuff 

    for (int q = 0; q < NUMBER_OF_TESTS; q++) { 

     // Do some work 

     await LoadImageAsync (imageResource); 

     // Do stuff 

     if (q < NUMBER_OF_TESTS - 1) { 
      stkImage.Children.Remove(mImageTested); 
      mImageTested = null; 
      GC.Collect(); 
     } 
    } 
} 

private async Task LoadImageAsync(string imageURI) 
{ 
    mImageTested = new Image { Aspect = Aspect.AspectFit }; 
    Task<ImageSource> result = Task<ImageSource>.Factory.StartNew(() => ImageSource.FromFile(imageURI)); 
    mImageTested.Source = await result; 
    stkImage.Children.Add(mImageTested); 
} 
+0

Ich glaube, Sie ein Misstake in Ihrem Beispiel gemacht. Es fügt ein paar neue Bilder zu stkImage.Children hinzu und entfernt dann die letzte. Die anderen sind weiterhin in stkImage.Children vorhanden, sodass GC.Collect() sie nicht entfernen kann. Ich frage mich auch, warum Sie mehrere Bilder für das gleiche Bild machen müssen? Kannst du den Verweis auf ein Bild nicht mehrmals verwenden? Das wird dir Speicher sparen. –

+0

@JaccoDieleman, es ist für Hochschulabsolventen Zweck. Ich erstelle eine Art Benchmark. In diesem Teil der Arbeit muss ich ein Bild etwa 50 Mal laden und die durchschnittliche Ladezeit messen. Ich könnte dies manuell machen, z. Führen Sie jede Ausführung aus und messen Sie ihre Zeit und berechnen Sie dann den Durchschnitt, aber ich würde das gerne innerhalb einer Schleife machen, wenn es natürlich möglich ist. Wenn ich eine Bildreferenz verwende, ist meine Messung nicht präzise. Was ich mit diesem Code versuche, ist: - Ein Bild hinzufügen - Wenn es nicht die letzte Ausführung ist, entfernen Sie es und rufen Sie GC.Collect() –

Antwort

Verwandte Themen